diff --git a/configuration.nix b/configuration.nix index 10b8535..554bdfc 100644 --- a/configuration.nix +++ b/configuration.nix @@ -4,19 +4,20 @@ with builtins; with lib; let - fn = import ./fn.nix { inherit lib; }; + fn = import (toString ./fn.nix) { inherit lib; }; # Cannot use here as those evaluations only work with existing paths >.< # hostName and secretPtah can be set with -I hostName=$HOSTNAME and -I secretPath=$SECRETPATH respectively # , defaults to the contents of /secret/hostName - secretPath = fn.ifelse ((tryEval ).value != false) - - /secret; - hostName = (findFirst - (elem: elem.prefix == "hostName") - { path = (fileContents "${secretPath}/hostName"); } - nixPath + secretPath = fn.ifelse ((tryEval (toString )).value != false) + (toString ) + (toString /secret); + hostName = ( + findFirst + (elem: elem.prefix == "hostName") + { path = (fileContents "${secretPath}/hostName"); } + nixPath ).path; - machinePath = (builtins.toPath ( ./machines + ("/" + hostName))); + machinePath = (builtins.toPath (./machines + ("/" + hostName))); machineFiles = fn.lst { p = machinePath; b = true; }; configFiles = fn.lst { p = (toString ./config); b = true; }; pkgsFiles = fn.lst { p = (toString ./pkgs); b = true; }; diff --git a/fn.nix b/fn.nix index 3d57527..8fd80df 100644 --- a/fn.nix +++ b/fn.nix @@ -9,6 +9,8 @@ rec { (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) @@ -23,11 +25,25 @@ rec { (hasAttrByPath a d) (hasAttr a d))) aList); - pkgFilter = l: (filter + 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 (elem true (hasAttrs [["meta" "broken"]] p)) - (warn "Package ${p.name} is marked as broken." false) - true) - ) - l); + ifelse (isBroken p) + false + (ifelse (depsBrokenRec p) + (warn "Dependency of ${p.name} is marked as broken." false) + true) + )) + ld); }