diff --git a/hive.nix b/hive.nix index c6aa9f6..de7b83a 100644 --- a/hive.nix +++ b/hive.nix @@ -1,9 +1,15 @@ let - sources = import ./npins; + sources' = import ./npins; + + # Patch sources directly + sources = builtins.mapAttrs ( + name: src: + (patch.base { pkgs = import sources'.nixos-unstable { }; }).applyPatches { inherit name src; } + ) sources'; lib = import (sources.nix-lib + "/src/trivial.nix"); - patch = import sources.nix-patches { patchFile = ./patches; }; + patch = import ./lib/nix-patches { patchFile = ./patches; }; nodes' = import ./meta/nodes.nix; nodes = builtins.attrNames nodes'; @@ -27,12 +33,9 @@ let # Builds a patched version of nixpkgs, only as the source mkNixpkgs' = v: - let - version = "nixos-${v}"; - in - patch.mkNixpkgsSrc { - src = sources.${version}; - inherit version; + patch.mkNixpkgsSrc rec { + src = sources'.${name}; + name = "nixos-${v}"; }; # Instanciates the required nixpkgs version diff --git a/lib/nix-patches/default.nix b/lib/nix-patches/default.nix new file mode 100644 index 0000000..6e03f83 --- /dev/null +++ b/lib/nix-patches/default.nix @@ -0,0 +1,113 @@ +# Copyright Tom Hubrecht, (2023-2024) +# +# Tom Hubrecht +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. + +{ + patchFile, + excludeGitHubManual ? true, + fetchers ? { }, +}: + +rec { + base = + { pkgs }: + + let + inherit (pkgs.lib) fakeHash optionalAttrs; + in + + rec { + mkUrlPatch = + attrs: + pkgs.fetchpatch ( + { + hash = fakeHash; + } + // attrs + // (optionalAttrs (excludeGitHubManual && !(builtins.hasAttr "includes" attrs)) { + excludes = (attrs.excludes or [ ]) ++ [ "nixos/doc/manual/*" ]; + }) + ); + + mkGitHubPatch = + { id, ... }@attrs: + mkUrlPatch ( + (builtins.removeAttrs attrs [ "id" ]) + // { + url = "https://github.com/NixOS/nixpkgs/pull/${builtins.toString id}.diff"; + } + ); + + mkCommitPatch = + { sha, ... }@attrs: + mkUrlPatch ( + (builtins.removeAttrs attrs [ "sha" ]) + // { + url = "https://github.com/NixOS/nixpkgs/commit/${builtins.toString sha}.diff"; + } + ); + + patchFunctions = { + commit = mkCommitPatch; + github = mkGitHubPatch; + remote = pkgs.fetchpatch; + static = attrs: attrs.path; + url = mkUrlPatch; + } // fetchers; + + mkPatch = + { + _type ? "github", + ... + }@attrs: + if builtins.hasAttr _type patchFunctions then + patchFunctions.${_type} (builtins.removeAttrs attrs [ "_type" ]) + else + throw "Unknown patch type: ${builtins.toString _type}."; + + mkPatches = v: builtins.map mkPatch ((import patchFile).${v} or [ ]); + + applyPatches = + { + src, + name, + patches ? mkPatches name, + }: + if patches == [ ] then + src + else + pkgs.applyPatches { + inherit patches src; + + name = "${name}-patched"; + }; + }; + + mkNixpkgsSrc = { src, name }: (base { pkgs = import src { }; }).applyPatches { inherit src name; }; +}