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.

Changed files
+62 -57
pkgs
+61
pkgs/top-level/impure-overlays.nix
···
+
/**
+
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
+
[ ]
+1 -57
pkgs/top-level/impure.nix
···
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
{
···
# 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 ? [ ],