summaryrefslogtreecommitdiffstats
path: root/pkgs/top-level/impure-overlays.nix
blob: 3d0c6831b919b21163728335c2b77483a2ed468a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
  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
      let
        overlay = import path;
      in
      if builtins.isFunction overlay then [ overlay ] else overlay;
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
  [ ]