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:
parent
957b920dfd
commit
bd3d85928a
61
pkgs/top-level/impure-overlays.nix
Normal file
61
pkgs/top-level/impure-overlays.nix
Normal 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
|
||||
[ ]
|
||||
@ -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 ? [ ],
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user