Sebastian Walz 860d31cee1
Tohu vaBohu
2023-04-21 00:22:52 +02:00

218 lines
7.1 KiB
Nix

{ nixpkgs, core, ... }:
let
inherit(core) context debug derivation error expression list path set string target type;
checkPackage
= name:
package:
let
inherit(expression.tryEval package) success value;
in
debug.info "checkPackage" "Check Package `${name}`"
(
if debug.Debug.isInstanceOf package
then
abort "${package}"
else if success
&& derivation.isInstanceOf' value
then
value
else if !success
then
debug.panic [ "checkPackage" name ]
{
text = "${name} does not evaluate!";
data = value;
}
else
debug.panic [ "checkPackage" ] "${name} is not a package, but a ${type.getPrimitive value}"
);
defaultAllowPredicate
= predicateName:
allowAll:
allowedPackages:
{
name ? null,
pname ? (extractPackageName name),
...
} @ pkg:
if pname != null
then
let
allowed = list.find pname allowedPackages;
allowed' = if allowed then "allowed" else "not allowed";
in
debug.warn [ "defaultAllowPredicate" ]
{
text = "${predicateName} package `${pname}` ${allowed'}.";
}
allowed
else
debug.panic [ "defaultAllowPredicate" ]
{
text = "Cannot determine pname of ${predicateName} package";
data = pkg;
nice = true;
}
false;
defaultHandleEvalIssue
= reason:
message:
debug.panic "defaultHandleEvalIssue"
{
text = reason;
data = message;
}
null;
extractPackageName
= name:
if name != null
then
list.head (string.split "-" name)
else
null;
fixConfig
= {
allowBroken ? false,
allowedInsecurePackages ? [],
allowedNonSourcePackages ? [],
allowedUnfreePackages ? [],
allowInsecure ? false,
allowInsecurePredicate ? (defaultAllowPredicate "insecure" allowInsecure allowedInsecurePackages),
allowlistedLicenses ? [],
allowNonSource ? false,
allowNonSourcePredicate ? (defaultAllowPredicate "non-source" allowNonSource allowedNonSourcePackages),
allowUnfree ? false,
allowUnfreePredicate ? (defaultAllowPredicate "unfree" allowUnfree allowedUnfreePackages),
allowUnsupportedSystem ? false,
blocklistedLicenses ? [],
checkMeta ? true,
handleEvalIssue ? defaultHandleEvalIssue,
inHydra ? false,
showDerivationWarnings ? [],
}:
{
inherit allowBroken
allowInsecurePredicate
allowlistedLicenses
allowNonSource allowNonSourcePredicate
allowUnfree allowUnfreePredicate
allowUnsupportedSystem
blocklistedLicenses
checkMeta
handleEvalIssue
inHydra
showDerivationWarnings;
};
fromNixpkgs
= { config ? {}, nixpkgs ? nixpkgs }:
registry:
let
legacyPackages = path.import' "${nixpkgs}/default.nix";
in
target.System.mapStdenv
(
system:
let
legacyPackages'
= legacyPackages
{
config = fixConfig config;
system = string system;
};
in
if registry != null
then
legacyPackages'.${registry}
else
legacyPackages'
);
load
= fileName:
registries:
let
loadPackage
= source:
package:
let
environment = registries // { inherit source; };
source' = source package;
in
type.matchPrimitiveOrPanic package
{
lambda = loadPackage source (package environment);
list = loadPackages source package;
null = [];
path = loadPackage source' (path.import package);
set
= debug.trace [ "load" "loadPackage" ]
{
text = "Package:";
data = package;
nice = false;
}
[ package ];
};
loadPackages
= source:
list.concatIMap
(
index:
loadPackage (source index)
);
packageList
= loadPackage
(context fileName)
fileName;
packages
= list.fold
(
{ ... } @ result:
{ name, ... } @ package:
if !(set.hasAttribute name result)
then
result
// {
${name} = package;
}
else if result.${name} == package
then
result
else
debug.panic [ "load" "packages" ]
{
text = "Package already in set";
data = package;
}
result
)
{}
packageList;
in
debug.debug "load"
{
text = "Loaded Packages";
data = packages;
nice = true;
}
(set.values packages);
load'
= fileName:
registries:
target.System.mapStdenv
(targetSystem: load fileName (registries { inherit targetSystem; }));
in
{
inherit extractPackageName fromNixpkgs load load';
}