nixpkgs/pkgs/top-level/impure-overlays.nix
Robert Hensing bd3d85928a 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.
2025-07-07 21:02:22 +02:00

62 lines
2.1 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
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
[ ]