pkgs/impure-overlays.nix: Factor out from impure.nix

No change in behavior.
By factoring this out, we can pass an extra overlay in addition to
the impure ones in callers.
This commit is contained in:
Robert Hensing 2025-07-07 20:30:20 +02:00
parent 957b920dfd
commit bd3d85928a
2 changed files with 62 additions and 57 deletions

View File

@ -0,0 +1,61 @@
/**
This file has as its value the list of overlays, as determined from the environment.
If Nix evaluation is [pure](https://nix.dev/manual/nix/latest/command-ref/conf-file.html?highlight=pure-eval#conf-pure-eval), then the list is empty.
*/
let
# Return x if it evaluates, or def if it throws an exception.
try =
x: def:
let
res = builtins.tryEval x;
in
if res.success then res.value else def;
homeDir = builtins.getEnv "HOME";
isDir = path: builtins.pathExists (path + "/.");
pathOverlays = try (toString <nixpkgs-overlays>) "";
homeOverlaysFile = homeDir + "/.config/nixpkgs/overlays.nix";
homeOverlaysDir = homeDir + "/.config/nixpkgs/overlays";
overlays =
path:
# check if the path is a directory or a file
if isDir path then
# it's a directory, so the set of overlays from the directory, ordered lexicographically
let
content = builtins.readDir path;
in
map (n: import (path + ("/" + n))) (
builtins.filter (
n:
(
builtins.match ".*\\.nix" n != null
&&
# ignore Emacs lock files (.#foo.nix)
builtins.match "\\.#.*" n == null
)
|| builtins.pathExists (path + ("/" + n + "/default.nix"))
) (builtins.attrNames content)
)
else
# it's a file, so the result is the contents of the file itself
import path;
in
if pathOverlays != "" && builtins.pathExists pathOverlays then
overlays pathOverlays
else if builtins.pathExists homeOverlaysFile && builtins.pathExists homeOverlaysDir then
throw ''
Nixpkgs overlays can be specified with ${homeOverlaysFile} or ${homeOverlaysDir}, but not both.
Please remove one of them and try again.
''
else if builtins.pathExists homeOverlaysFile then
if isDir homeOverlaysFile then
throw (homeOverlaysFile + " should be a file")
else
overlays homeOverlaysFile
else if builtins.pathExists homeOverlaysDir then
if !(isDir homeOverlaysDir) then
throw (homeOverlaysDir + " should be a directory")
else
overlays homeOverlaysDir
else
[ ]

View File

@ -7,14 +7,6 @@ let
homeDir = builtins.getEnv "HOME";
# Return x if it evaluates, or def if it throws an exception.
try =
x: def:
let
res = builtins.tryEval x;
in
if res.success then res.value else def;
in
{
@ -50,55 +42,7 @@ in
# Overlays are used to extend Nixpkgs collection with additional
# collections of packages. These collection of packages are part of the
# fix-point made by Nixpkgs.
overlays ?
let
isDir = path: builtins.pathExists (path + "/.");
pathOverlays = try (toString <nixpkgs-overlays>) "";
homeOverlaysFile = homeDir + "/.config/nixpkgs/overlays.nix";
homeOverlaysDir = homeDir + "/.config/nixpkgs/overlays";
overlays =
path:
# check if the path is a directory or a file
if isDir path then
# it's a directory, so the set of overlays from the directory, ordered lexicographically
let
content = builtins.readDir path;
in
map (n: import (path + ("/" + n))) (
builtins.filter (
n:
(
builtins.match ".*\\.nix" n != null
&&
# ignore Emacs lock files (.#foo.nix)
builtins.match "\\.#.*" n == null
)
|| builtins.pathExists (path + ("/" + n + "/default.nix"))
) (builtins.attrNames content)
)
else
# it's a file, so the result is the contents of the file itself
import path;
in
if pathOverlays != "" && builtins.pathExists pathOverlays then
overlays pathOverlays
else if builtins.pathExists homeOverlaysFile && builtins.pathExists homeOverlaysDir then
throw ''
Nixpkgs overlays can be specified with ${homeOverlaysFile} or ${homeOverlaysDir}, but not both.
Please remove one of them and try again.
''
else if builtins.pathExists homeOverlaysFile then
if isDir homeOverlaysFile then
throw (homeOverlaysFile + " should be a file")
else
overlays homeOverlaysFile
else if builtins.pathExists homeOverlaysDir then
if !(isDir homeOverlaysDir) then
throw (homeOverlaysDir + " should be a directory")
else
overlays homeOverlaysDir
else
[ ],
overlays ? import ./impure-overlays.nix,
crossOverlays ? [ ],