218 lines
7.1 KiB
Nix
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';
|
|
}
|