Format project using nixfmt rfc candidate.

This commit is contained in:
Kevin Baensch 2024-11-20 20:32:38 +01:00
parent 1f63817684
commit a9f7fe416f
Signed by: derped
GPG key ID: C0F1D326C7626543
91 changed files with 1347 additions and 1000 deletions

187
fn.nix
View file

@ -1,85 +1,94 @@
{lib}:
{ lib }:
with builtins;
with lib; rec {
ifelse = a: b: c:
if a
then b
else c;
fileContentsOr = a: b: (ifelse
(pathIsRegularFile a)
a
b);
with lib;
rec {
ifelse =
a: b: c:
if a then b else c;
fileContentsOr = a: b: (ifelse (pathIsRegularFile a) a b);
cwd = builtins.getEnv "PWD";
# 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 {inherit p;});
lsd = p: (lst {
inherit p;
t = "directory";
b = true;
});
lsfRec = p: b:
flatten ((map (np: lsfRec np b) (lsd p))
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 { inherit p; });
lsd =
p:
(lst {
inherit p;
t = "directory";
b = true;
});
lsfRec =
p: b:
flatten (
(map (np: lsfRec np b) (lsd p))
++ (lst {
inherit p;
inherit b;
}));
hasAttrs = aList: d: (map
(a: (ifelse (isList a)
(hasAttrByPath a d)
(hasAttr a d)))
aList);
})
);
hasAttrs = aList: d: (map (a: (ifelse (isList a) (hasAttrByPath a d) (hasAttr a d))) aList);
# Not sure how list operations are implemented in Nix
# This might be a tad bit inefficient.
# TODO: look for better implementation (map is a builtin function so checking that probably won't help)
# Sequentially checks elements of list (l) for condition (cond) and executes do on first match.
meetsConDo = cond: do: l:
ifelse (l == []) false
(let
h = head l;
t = tail l;
in
ifelse (cond h) (do h)
(meetsConDo cond do t));
deps = p:
ifelse (isAttrs p) (
filter isAttrs
(p.buildInputs ++ p.nativeBuildInputs ++ p.propagatedBuildInputs ++ p.propagatedNativeBuildInputs)
) [];
meetsConDo =
cond: do: l:
ifelse (l == [ ]) false (
let
h = head l;
t = tail l;
in
ifelse (cond h) (do h) (meetsConDo cond do t)
);
deps =
p:
ifelse (isAttrs p) (filter isAttrs (
p.buildInputs ++ p.nativeBuildInputs ++ p.propagatedBuildInputs ++ p.propagatedNativeBuildInputs
)) [ ];
importFilter = l: filter (n: elem (nameFromURL (toString n) ".") l);
depsRec = ld: ifelse (ld == []) [] ((toList ld) ++ (depsRec (lists.unique (lists.flatten (map deps (toList ld))))));
isBroken = p:
meetsConDo (s: ((hasAttrByPath s.path p) && (s.check (getAttrFromPath s.path p)))) (s: s.msg)
[
depsRec =
ld:
ifelse (ld == [ ]) [ ] (
(toList ld) ++ (depsRec (lists.unique (lists.flatten (map deps (toList ld)))))
);
isBroken =
p:
meetsConDo (s: ((hasAttrByPath s.path p) && (s.check (getAttrFromPath s.path p)))) (s: s.msg) [
{
path = ["meta" "broken"];
path = [
"meta"
"broken"
];
msg = warn "Package ${p.name} is marked as broken." true;
check = m: m;
}
{
path = ["meta" "knownVulnerabilities"];
path = [
"meta"
"knownVulnerabilities"
];
msg = warn "Package ${p.name} has known Vulnerabilities.." true;
check = m: m != [];
check = m: m != [ ];
}
{
path = ["name"];
path = [ "name" ];
msg = warn "${p.name}: python2 is depricated." false;
check = m: (strings.hasInfix "python2" m) || (strings.hasInfix "python-2" m);
}
# not sure if the following test creates false positives (AFAIK every derivation/package needs to have an outPath)
# , definitely should catch all corner cases/everything that fails to evaluate.
{
path = ["outPath"];
path = [ "outPath" ];
msg = warn "Package ${p.name} has no outPath" true;
check = m: !(tryEval m).success;
}
@ -87,35 +96,45 @@ with lib; rec {
depsBroken = p: lists.any (p: (isBroken p)) (deps p);
# No more magic 🧙 here 😢
# But at least it now (hopefully) checks ONLY dependencies (and all of them at that).
depsBrokenRec = p: (
meetsConDo
(p: ifelse (depsBroken p) true (depsBrokenRec (deps p)))
(p: true) (deps p)
);
sopsHelper = template: names: options: let
optionsIsFunction = (typeOf options) == "lambda";
in
listToAttrs (map
(name: {
depsBrokenRec =
p: (meetsConDo (p: ifelse (depsBroken p) true (depsBrokenRec (deps p))) (p: true) (deps p));
sopsHelper =
template: names: options:
let
optionsIsFunction = (typeOf options) == "lambda";
in
listToAttrs (
map (name: {
name = template name;
value = ifelse optionsIsFunction (options name) options;
})
names);
pkgFilter = ld: (filter
(p: (
ifelse (isBroken p)
false
(ifelse (depsBrokenRec p)
(warn "Dependency of ${p.name} is marked as broken." false)
true)
))
ld);
makeOptionTypeList = path: (
lists.forEach
# get a list of all files ending in .nix in path
(filter (hasSuffix ".nix")
(lsfRec path true))
# remove leading path and trailing ".nix", replace every slash with "::"
(replaceStrings ["${path}/" "/" ".nix"] ["" "::" ""])
);
}) names
);
pkgFilter =
ld:
(filter (
p:
(ifelse (isBroken p) false (
ifelse (depsBrokenRec p) (warn "Dependency of ${p.name} is marked as broken." false) true
))
) ld);
makeOptionTypeList =
path:
(lists.forEach
# get a list of all files ending in .nix in path
(filter (hasSuffix ".nix") (lsfRec path true))
# remove leading path and trailing ".nix", replace every slash with "::"
(
replaceStrings
[
"${path}/"
"/"
".nix"
]
[
""
"::"
""
]
)
);
}