From 3ffb8d822789319c9c67b59c4530ed371f8b4c3e Mon Sep 17 00:00:00 2001 From: Valentin Gagarin Date: Wed, 7 Feb 2024 00:25:38 +0100 Subject: [PATCH] rework the way redirects are built --- CONTRIBUTING.md | 32 ++++++------- default.nix | 88 ++++++++++++++++++++-------------- nix/sources.json | 44 +++++++++++++++-- source/reference/nix-manual.md | 16 +++---- 4 files changed, 114 insertions(+), 66 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d12327c..c9610de 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,31 +30,29 @@ The following manual steps are required: - Regularly update the inputs to use the latest versions of the Nix release branches with `nix shell --run "niv update"` To avoid long build times, make sure Nix can be fetched from the cache. - If it doesn't, find the latest commit that is [built by Hydra](https://hydra.nixos.org/project/nix). For example, to pin Nix 2.18: + If it doesn't, find the latest commit that is [built by Hydra](https://hydra.nixos.org/project/nix). For example, to update the latest Nix release to 2.20: ```bash - niv update nix_2-18 -r f5f4de6a550327b4b1a06123c2e450f1b92c73b6 + niv update nix-stable -b 2.20-maintenance -r 7599d4bbed3c188c72b547fc08c7b022e7d1c54f ``` -- On each new Nix release: +- On each new Nix release, update the `nix-latest` to the corresponding release branch: - 1. Add the latest version in [`default.nix`](./default.nix). - For example, to add Nix 2.19: - - ```bash - niv add nixos/nix -n nix_2-19 -b 2.19-maintenance - ``` - - 2. Reference the latest version in [`source/reference/nix-manual.md`](./source/reference/nix-manual.md). - -- If an unstable or stable release of Nixpkgs adopt a new version of Nix, update the corresponding references here. - - Also update URLs to the the Nix manual to the version used by Nixpkgs unstable. - For example, if one wants to move from 2.18 to 2.19: ```bash - sed -i 's#https://nix.dev/manual/nix/2.18/#https://nix.dev/manual/nix/2.19/#g' $(ls **/*.md) + niv update nix-latest -b 2.20-maintenance ``` +- On each new Nixpkgs release, update `nixpkgs-stable` and `nixpkgs-prev-stable` and the corresponding Nix versions: + + ```bash + niv update nixpkgs-stable -b nixos-24.05 + niv update nix-stable -b 2.19-maintenance + niv update nixpkgs-prev-stable -b nixos-23.11 + niv update nix-prev-stable -b 2.18-maintenance + ``` + +It would be nice to have *efficient* automatic updates. + ## Contributor guides Please read [Contributing Documentation](https://nix.dev/contributing/documentation). diff --git a/default.nix b/default.nix index 2cc6937..744f5cd 100644 --- a/default.nix +++ b/default.nix @@ -3,26 +3,30 @@ , }: let - pkgs = import inputs.nixpkgs { + pkgs = import inputs.nixpkgs-prev-stable { config = { }; overlays = [ (import ./overlay.nix) ]; inherit system; }; + lib = pkgs.lib; nix-dev = let - # Various versions of the Nix manuals, grep for (nix-manual)= to find where they are displayed + # Various versions of the Nix manuals, grep for (nix-manual)= to find where they are displayed. # FIXME: This requires human interaction to update! See ./CONTRIBUTING.md for details. - nix-releases = { - latest = "2.19"; - rolling = "2.18"; - stable = "2.18"; - prev-stable = "2.13"; - }; - nixpkgs-releases = { - stable = "23.11"; - prev-stable = "23.05"; + releases = rec { + nixpkgs-rolling = import inputs.nixpkgs-rolling { } // { inherit (nixpkgs-rolling.lib) version; }; + nixpkgs-stable = import inputs.nixpkgs-stable { } // { inherit (nixpkgs-stable.lib) version; }; + nixpkgs-prev-stable = import inputs.nixpkgs-prev-stable { } // { inherit (nixpkgs-prev-stable.lib) version; }; + nix-latest = (import inputs.nix-latest).default; + # TODO: to further simplify this and get Nix from Nixpkgs with all required files present, + # make a patch release of Nix after https://github.com/NixOS/nix/pull/9949 lands, + # and bump the respective version in the respective Nixpkgs `release-*` branch. + nix-rolling = (import inputs.nix-rolling).default; + nix-stable = (import inputs.nix-stable).default; + nix-prev-stable = (import inputs.nix-prev-stable).default; }; + version = package: lib.versions.majorMinor package.version; in pkgs.stdenv.mkDerivation { name = "nix-dev"; @@ -40,47 +44,57 @@ let buildPhase = let nix-manual-index = - with pkgs.lib.attrsets; - let - raw = builtins.readFile ./source/reference/nix-manual.md; - nix-replacements = mapAttrsToList (release: version: "@${release}@") nix-releases; - nixpkgs-replacements = mapAttrsToList (release: version: "@nixpkgs-${release}@") nixpkgs-releases; - in - pkgs.lib.strings.replaceStrings - (nix-replacements ++ nixpkgs-replacements) - (attrValues nix-releases ++ attrValues nixpkgs-releases) - raw; + with lib.attrsets; + with lib.strings; + replaceStrings + (mapAttrsToList (release: _: "@${release}@") releases) + (mapAttrsToList (_: package: version package) releases) + (builtins.readFile ./source/reference/nix-manual.md); in '' cp -f ${builtins.toFile "nix-manual.md" nix-manual-index} $TMP/nix.dev/source/reference/nix-manual.md make html ''; installPhase = - with pkgs.lib.attrsets; - with pkgs.lib.strings; + with lib.attrsets; + with lib.strings; let - nix-versions = with pkgs.lib; lists.unique (attrsets.attrValues nix-releases); - inputName = version: pkgs.lib.strings.replaceStrings [ "." ] [ "-" ] version; - nix-src = version: inputs."nix_${inputName version}"; - nix-manual = version: (import (nix-src version)).default.doc; - copy = version: '' - cp -Rf ${nix-manual version}/share/doc/nix/manual/* $out/manual/nix/${version} + nix-releases = + let + package = name: elemAt (splitString "-" name) 0; + release = name: elemAt (splitString "-" name) 1; + filtered = filterAttrs (name: value: (package name) == "nix") releases; + in + mapAttrs' (name: value: { name = release name; inherit value; }) filtered; + # the same Nix version could appear in multiple Nixpkgs releases, + # but we want to copy each exactly once. + unique-version = + let + version-exists = p: ps: elem (version p) (map (x: version x) ps); + in + lib.lists.foldl' (acc: elem: if version-exists elem acc then acc else acc ++ [ elem ]) [ ]; + copy = nix: '' + cp -Rf ${nix.doc}/share/doc/nix/manual/* $out/manual/nix/${version nix} ''; - # add upstream page redirects of the form ` `, excluding comment lines and empty - redirects = version: '' - sed '/^#/d;/^$/d;s#^\(.*\) \(.*\) #/manual/nix/${version}\1 /manual/nix/${version}\2 #g' ${nix-src version}/doc/manual/_redirects >> $out/_redirects + # add upstream page redirects of the form ` `, excluding comments and empty lines + # TODO: once https://github.com/NixOS/nix/pull/9949 lands, bump the source and use: + # ${nix.doc}/share/doc/nix/manual/_redirects + # also remove the then unnecessary file from the root directory of the manual: + # rm $out/manual/nix/${version nix}/_redirects + redirects = nix: '' + sed '/^#/d;/^$/d;s#^\(.*\) \(.*\) #/manual/nix/${version nix}\1 /manual/nix/${version nix}\2 #g' ${nix.src}/doc/manual/_redirects >> $out/_redirects ''; - shortlink = release: version: '' - echo /manual/nix/${release} /manual/nix/${version}/ 302 >> $out/_redirects + shortlink = release: nix: '' + echo /nix/manual/${release} /nix/manual/${nix.version}/ 302 >> $out/_redirects ''; in '' mkdir -p $out cp -R build/html/* $out/ # NOTE: the comma in the shell expansion makes it also work for singleton lists - mkdir -p $out/manual/nix/{${concatStringsSep "," nix-versions},} - ${concatStringsSep "\n" (map copy nix-versions)} - ${concatStringsSep "\n" (map redirects nix-versions)} + mkdir -p $out/manual/nix/{${concatStringsSep "," (mapAttrsToList (_: nix: version nix) nix-releases)},} + ${concatStringsSep "\n" (map copy (unique-version (attrValues nix-releases)))} + ${concatStringsSep "\n" (map redirects (unique-version (attrValues nix-releases)))} ${concatStringsSep "\n" (mapAttrsToList shortlink nix-releases)} ''; }; diff --git a/nix/sources.json b/nix/sources.json index af08ddd..ca6c0bd 100644 --- a/nix/sources.json +++ b/nix/sources.json @@ -1,5 +1,5 @@ { - "nix_2-13": { + "nix-prev-stable": { "branch": "2.13-maintenance", "description": "Nix, the purely functional package manager", "homepage": "https://nixos.org/", @@ -11,7 +11,7 @@ "url": "https://github.com/nixos/nix/archive/25f2dfc6e41d8c30e7abc443a7b262e34e49253b.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, - "nix_2-18": { + "nix-rolling": { "branch": "2.18-maintenance", "description": "Nix, the purely functional package manager", "homepage": "https://nixos.org/", @@ -23,7 +23,7 @@ "url": "https://github.com/nixos/nix/archive/60eb80593f3a18aebc7672ad7007cb23c14db061.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, - "nix_2-19": { + "nix-latest": { "branch": "2.19-maintenance", "description": "Nix, the purely functional package manager", "homepage": "https://nixos.org/", @@ -35,7 +35,19 @@ "url": "https://github.com/nixos/nix/archive/dc09e6193bffcab37d3d43107eae9464395ab51d.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, - "nixpkgs": { + "nix-stable": { + "branch": "2.18-maintenance", + "description": "Nix, the purely functional package manager", + "homepage": "https://nixos.org/", + "owner": "nixos", + "repo": "nix", + "rev": "60eb80593f3a18aebc7672ad7007cb23c14db061", + "sha256": "0nyssab6skn9qd7mz4v0y3ycnhck7is6agm0i26l1anrgs90x37l", + "type": "tarball", + "url": "https://github.com/nixos/nix/archive/60eb80593f3a18aebc7672ad7007cb23c14db061.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "nixpkgs-prev-stable": { "branch": "nixos-23.05", "description": "Nix Packages collection & NixOS", "homepage": "", @@ -47,6 +59,30 @@ "url": "https://github.com/NixOS/nixpkgs/archive/898cb2064b6e98b8c5499f37e81adbdf2925f7c5.tar.gz", "url_template": "https://github.com///archive/.tar.gz" }, + "nixpkgs-rolling": { + "branch": "nixpkgs-unstable", + "description": "Nix Packages collection & NixOS", + "homepage": "", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "8cc79aa39bbc6eaedaf286ae655b224c71e02907", + "sha256": "08yj32spm74bqnwq7wyaxzqjw3dc67bb3myx1baix506as54jr3y", + "type": "tarball", + "url": "https://github.com/nixos/nixpkgs/archive/8cc79aa39bbc6eaedaf286ae655b224c71e02907.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, + "nixpkgs-stable": { + "branch": "nixos-23.11", + "description": "Nix Packages collection & NixOS", + "homepage": "", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "9f2ee8c91ac42da3ae6c6a1d21555f283458247e", + "sha256": "0imgfxzq7d7l6fcgnzzjvv6ch560svcm8s8bx8vqyvf60w24ma1d", + "type": "tarball", + "url": "https://github.com/nixos/nixpkgs/archive/9f2ee8c91ac42da3ae6c6a1d21555f283458247e.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + }, "poetry2nix": { "branch": "master", "description": "Convert poetry projects to nix automagically [maintainer=@adisbladis] ", diff --git a/source/reference/nix-manual.md b/source/reference/nix-manual.md index 367c687..e4038cd 100644 --- a/source/reference/nix-manual.md +++ b/source/reference/nix-manual.md @@ -11,29 +11,29 @@ This page is pre-processed before rendering with Sphinx. For details: :hidden: Nix pre-release (development) -Nix @latest@ (latest) -Nix @rolling@ (in rolling) -Nix @stable@ (in stable @nixpkgs-stable@) -Nix @prev-stable@ (in stable @nixpkgs-prev-stable@) +Nix @nix-latest@ (latest) +Nix @nix-rolling@ (in Nixpkgs rolling) +Nix @nix-stable@ (in Nixpkgs @nixpkgs-stable@) +Nix @nix-prev-stable@ (in Nixpkgs @nixpkgs-prev-stable@) ``` - [Nix pre-release](https://hydra.nixos.org/job/nix/master/build.x86_64-linux/latest/download) Latest build from the `master` branch of the [Nix repository](https://github.com/NixOS/nix) -- [Nix @latest@](https://nix.dev/manual/nix/latest/) +- [Nix @nix-latest@](https://nix.dev/manual/nix/latest/) Latest Nix release -- [Nix @rolling@](https://nix.dev/manual/nix/rolling/) +- [Nix @nix-rolling@](https://nix.dev/manual/nix/rolling/) Shipped with the {term}`Nixpkgs` and {term}`NixOS` rolling release -- [Nix @stable@](https://nix.dev/manual/nix/stable/) +- [Nix @nix-stable@](https://nix.dev/manual/nix/stable/) Shipped with the current {term}`Nixpkgs` and {term}`NixOS` @nixpkgs-stable@ stable release -- [Nix @prev-stable@](https://nix.dev/manual/nix/prev-stable/) +- [Nix @nix-prev-stable@](https://nix.dev/manual/nix/prev-stable/) Shipped with the previous {term}`Nixpkgs` and {term}`NixOS` @nixpkgs-prev-stable@ stable release