49 lines
1.6 KiB
Nix
49 lines
1.6 KiB
Nix
{ lib }:
|
|
|
|
with builtins;
|
|
with lib;
|
|
|
|
rec {
|
|
ifelse = a: b: c: if a then b else c;
|
|
fileContentsOr = a: b: (ifelse
|
|
(pathIsRegularFile a)
|
|
a b);
|
|
cwd = toString ./.;
|
|
|
|
# lst (string PATH) (string FILETYPE) (bool RETURNFULLPATH)
|
|
lst = { p ? cwd, t ? "regular", b ? false }: (lists.forEach
|
|
(attrNames
|
|
(filterAttrs (n: v: v == t)
|
|
(readDir p)))
|
|
(v: ((optionalString b "${p}/") + v)));
|
|
lsf = p: (lst { p = p; });
|
|
lsd = p: (lst { p = p; t = "directory"; b = true; });
|
|
lsfRec = p: b: flatten ((map (np: lsfRec np b) (lsd p)) ++ (lst { p = p; b = b; }));
|
|
hasAttrs = aList: d: (map
|
|
(a:
|
|
(ifelse (isList a)
|
|
(hasAttrByPath a d)
|
|
(hasAttr a d)))
|
|
aList);
|
|
deps = p: ifelse (isAttrs p) (filter (p: isAttrs p)
|
|
(p.buildInputs ++ p.nativeBuildInputs ++ p.propagatedBuildInputs ++ p.propagatedNativeBuildInputs)
|
|
) [];
|
|
importFilter = l: p: filter (n: elem (nameFromURL (toString n) ".") l) p;
|
|
depsRec = ld: ifelse (ld == []) [] ((toList ld) ++ (depsRec (lists.unique (lists.flatten (map (d: deps d) (toList ld))))));
|
|
isBroken = p: ifelse ((elem true (hasAttrs [["meta" "broken"]] p)) && (p.meta.broken == true))
|
|
(warn "Package ${p.name} is marked as broken." true)
|
|
false;
|
|
depsBroken = p: lists.any (p: (isBroken p)) (deps p);
|
|
# Those two lines are quite magical 🧙
|
|
depsBrokenRec = p: (b: b == true) (ifelse (depsBroken p) true
|
|
(map (p: depsBrokenRec p) (deps p)));
|
|
pkgFilter = ld: (filter
|
|
(p: (
|
|
ifelse (isBroken p)
|
|
false
|
|
(ifelse (depsBrokenRec p)
|
|
(warn "Dependency of ${p.name} is marked as broken." false)
|
|
true)
|
|
))
|
|
ld);
|
|
}
|