style: Switch to nixfmt from nixpkgs-fmt
Most of the ecosystem has moved to this formatter, and many people configured their editors to autoformat it with this formatter. Closes: https://git.snix.dev/snix/snix/issues/62 Change-Id: Icf39e7836c91fc2ae49fbe22a40a639105bfb0bd Reviewed-on: https://cl.snix.dev/c/snix/+/30671 Reviewed-by: Florian Klink <flokli@flokli.de> Tested-by: besadii Autosubmit: Ilan Joselevich <personal@ilanjoselevich.com>
This commit is contained in:
parent
3443e6bd08
commit
91d02d8c84
136 changed files with 39952 additions and 11007 deletions
|
|
@ -1,4 +1,9 @@
|
|||
{ lib, depot, pkgs, ... }:
|
||||
{
|
||||
lib,
|
||||
depot,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
|
||||
let
|
||||
inherit (builtins) unsafeDiscardStringContext appendContext;
|
||||
|
|
@ -18,23 +23,22 @@ let
|
|||
directDrvDeps =
|
||||
let
|
||||
getDeps =
|
||||
if lib.versionAtLeast builtins.nixVersion "2.6"
|
||||
then
|
||||
# Since https://github.com/NixOS/nix/pull/1643, Nix apparently »preserves
|
||||
# string context« through a readFile invocation. This has the side effect
|
||||
# that it becomes possible to query the actual references a store path has.
|
||||
# Not a 100% sure this is intended, but _very_ convenient for us here.
|
||||
drvPath:
|
||||
builtins.attrNames (builtins.getContext (builtins.readFile drvPath))
|
||||
if lib.versionAtLeast builtins.nixVersion "2.6" then
|
||||
# Since https://github.com/NixOS/nix/pull/1643, Nix apparently »preserves
|
||||
# string context« through a readFile invocation. This has the side effect
|
||||
# that it becomes possible to query the actual references a store path has.
|
||||
# Not a 100% sure this is intended, but _very_ convenient for us here.
|
||||
drvPath: builtins.attrNames (builtins.getContext (builtins.readFile drvPath))
|
||||
else
|
||||
# For Nix < 2.6 we have to rely on HACK, namely grepping for quoted
|
||||
# store path references in the file. In the future this should be
|
||||
# replaced by a proper derivation parser.
|
||||
drvPath: builtins.concatLists (
|
||||
# For Nix < 2.6 we have to rely on HACK, namely grepping for quoted
|
||||
# store path references in the file. In the future this should be
|
||||
# replaced by a proper derivation parser.
|
||||
drvPath:
|
||||
builtins.concatLists (
|
||||
builtins.filter builtins.isList (
|
||||
builtins.split
|
||||
"\"(${lib.escapeRegex builtins.storeDir}/[[:alnum:]+._?=-]+.drv)\""
|
||||
(builtins.readFile drvPath)
|
||||
builtins.split "\"(${lib.escapeRegex builtins.storeDir}/[[:alnum:]+._?=-]+.drv)\"" (
|
||||
builtins.readFile drvPath
|
||||
)
|
||||
)
|
||||
);
|
||||
in
|
||||
|
|
@ -42,15 +46,12 @@ let
|
|||
# if the passed path is not a derivation we can't necessarily get its
|
||||
# dependencies, since it may not be representable as a Nix string due to
|
||||
# NUL bytes, e.g. compressed patch files imported into the Nix store.
|
||||
if builtins.match "^.+\\.drv$" drvPath == null
|
||||
then [ ]
|
||||
else getDeps drvPath;
|
||||
if builtins.match "^.+\\.drv$" drvPath == null then [ ] else getDeps drvPath;
|
||||
|
||||
# Maps a list of derivation to the list of corresponding `drvPath`s.
|
||||
#
|
||||
# Type: [drv] -> [str]
|
||||
drvsToPaths = drvs:
|
||||
builtins.map (drv: builtins.unsafeDiscardOutputDependency drv.drvPath) drvs;
|
||||
drvsToPaths = drvs: builtins.map (drv: builtins.unsafeDiscardOutputDependency drv.drvPath) drvs;
|
||||
|
||||
#
|
||||
# Calculate map of direct derivation dependencies
|
||||
|
|
@ -62,7 +63,8 @@ let
|
|||
# generating the map from
|
||||
#
|
||||
# Type: bool -> string -> set
|
||||
drvEntry = known: drvPath:
|
||||
drvEntry =
|
||||
known: drvPath:
|
||||
let
|
||||
# key may not refer to a store path, …
|
||||
key = unsafeDiscardStringContext drvPath;
|
||||
|
|
@ -85,7 +87,8 @@ let
|
|||
# attribute to `true` if it is in the list of input derivation paths.
|
||||
#
|
||||
# Type: [str] -> set
|
||||
plainDrvDepMap = drvPaths:
|
||||
plainDrvDepMap =
|
||||
drvPaths:
|
||||
builtins.listToAttrs (
|
||||
builtins.genericClosure {
|
||||
startSet = builtins.map (drvEntry true) drvPaths;
|
||||
|
|
@ -121,13 +124,15 @@ let
|
|||
# `fmap (builtins.getAttr "knownDeps") (getAttr drvPath)` will always succeed.
|
||||
#
|
||||
# Type: str -> stateMonad drvDepMap null
|
||||
insertKnownDeps = drvPathWithContext:
|
||||
insertKnownDeps =
|
||||
drvPathWithContext:
|
||||
let
|
||||
# We no longer need to read from the store, so context is irrelevant, but
|
||||
# we need to check for attr names which requires the absence of context.
|
||||
drvPath = unsafeDiscardStringContext drvPathWithContext;
|
||||
in
|
||||
bind get (initDepMap:
|
||||
bind get (
|
||||
initDepMap:
|
||||
# Get the dependency map's state before we've done anything to obtain the
|
||||
# entry we'll be manipulating later as well as its dependencies.
|
||||
let
|
||||
|
|
@ -135,57 +140,48 @@ let
|
|||
|
||||
# We don't need to recurse if our direct dependencies either have their
|
||||
# knownDeps list already populated or are known dependencies themselves.
|
||||
depsPrecalculated =
|
||||
builtins.partition
|
||||
(dep:
|
||||
initDepMap.${dep}.known
|
||||
|| initDepMap.${dep} ? knownDeps
|
||||
)
|
||||
entryPoint.deps;
|
||||
depsPrecalculated = builtins.partition (
|
||||
dep: initDepMap.${dep}.known || initDepMap.${dep} ? knownDeps
|
||||
) entryPoint.deps;
|
||||
|
||||
# If a direct dependency is known, it goes right to our known dependency
|
||||
# list. If it is unknown, we can copy its knownDeps list into our own.
|
||||
initiallyKnownDeps =
|
||||
builtins.concatLists (
|
||||
builtins.map
|
||||
(dep:
|
||||
if initDepMap.${dep}.known
|
||||
then [ dep ]
|
||||
else initDepMap.${dep}.knownDeps
|
||||
)
|
||||
depsPrecalculated.right
|
||||
);
|
||||
initiallyKnownDeps = builtins.concatLists (
|
||||
builtins.map (
|
||||
dep: if initDepMap.${dep}.known then [ dep ] else initDepMap.${dep}.knownDeps
|
||||
) depsPrecalculated.right
|
||||
);
|
||||
in
|
||||
|
||||
# If the information was already calculated before, we can exit right away
|
||||
if entryPoint ? knownDeps
|
||||
then pure null
|
||||
if entryPoint ? knownDeps then
|
||||
pure null
|
||||
else
|
||||
after
|
||||
# For all unknown direct dependencies which don't have a `knownDeps`
|
||||
# list, we call ourselves recursively to populate it. Since this is
|
||||
# done sequentially in the state monad, we avoid recalculating the
|
||||
# list for the same derivation multiple times.
|
||||
(for_
|
||||
depsPrecalculated.wrong
|
||||
insertKnownDeps)
|
||||
(for_ depsPrecalculated.wrong insertKnownDeps)
|
||||
# After this we can obtain the updated dependency map which will have
|
||||
# a `knownDeps` list for all our direct dependencies and update the
|
||||
# entry for the input `drvPath`.
|
||||
(bind
|
||||
get
|
||||
(populatedDepMap:
|
||||
(setAttr drvPath (entryPoint // {
|
||||
knownDeps =
|
||||
lib.unique (
|
||||
(
|
||||
bind get (
|
||||
populatedDepMap:
|
||||
(setAttr drvPath (
|
||||
entryPoint
|
||||
// {
|
||||
knownDeps = lib.unique (
|
||||
initiallyKnownDeps
|
||||
++ builtins.concatLists (
|
||||
builtins.map
|
||||
(dep: populatedDepMap.${dep}.knownDeps)
|
||||
depsPrecalculated.wrong
|
||||
++ builtins.concatLists (
|
||||
builtins.map (dep: populatedDepMap.${dep}.knownDeps) depsPrecalculated.wrong
|
||||
)
|
||||
);
|
||||
}))))
|
||||
}
|
||||
))
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
# This function puts it all together and is exposed via `__functor`.
|
||||
|
|
@ -204,14 +200,8 @@ let
|
|||
# */
|
||||
# ];
|
||||
# }
|
||||
knownDrvDepMap = knownDrvPaths:
|
||||
run
|
||||
(plainDrvDepMap knownDrvPaths)
|
||||
(after
|
||||
(for_
|
||||
knownDrvPaths
|
||||
insertKnownDeps)
|
||||
get);
|
||||
knownDrvDepMap =
|
||||
knownDrvPaths: run (plainDrvDepMap knownDrvPaths) (after (for_ knownDrvPaths insertKnownDeps) get);
|
||||
|
||||
#
|
||||
# Other things based on knownDrvDepMap
|
||||
|
|
@ -221,39 +211,39 @@ let
|
|||
# name, so multiple entries can be collapsed if they have the same name.
|
||||
#
|
||||
# Type: [drv] -> drv
|
||||
knownDependencyGraph = name: drvs:
|
||||
knownDependencyGraph =
|
||||
name: drvs:
|
||||
let
|
||||
justName = drvPath:
|
||||
builtins.substring
|
||||
(builtins.stringLength builtins.storeDir + 1 + 32 + 1)
|
||||
(builtins.stringLength drvPath)
|
||||
(unsafeDiscardStringContext drvPath);
|
||||
justName =
|
||||
drvPath:
|
||||
builtins.substring (
|
||||
builtins.stringLength builtins.storeDir + 1 + 32 + 1
|
||||
) (builtins.stringLength drvPath) (unsafeDiscardStringContext drvPath);
|
||||
|
||||
gv = pkgs.writeText "${name}-dependency-analysis.gv" ''
|
||||
digraph depot {
|
||||
${
|
||||
(lib.concatStringsSep "\n"
|
||||
(lib.mapAttrsToList (name: value:
|
||||
if !value.known then ""
|
||||
else lib.concatMapStringsSep "\n"
|
||||
(knownDep: " \"${justName name}\" -> \"${justName knownDep}\"")
|
||||
value.knownDeps
|
||||
)
|
||||
(depot.nix.dependency-analyzer (
|
||||
drvsToPaths drvs
|
||||
))))
|
||||
(lib.concatStringsSep "\n" (
|
||||
lib.mapAttrsToList (
|
||||
name: value:
|
||||
if !value.known then
|
||||
""
|
||||
else
|
||||
lib.concatMapStringsSep "\n" (
|
||||
knownDep: " \"${justName name}\" -> \"${justName knownDep}\""
|
||||
) value.knownDeps
|
||||
) (depot.nix.dependency-analyzer (drvsToPaths drvs))
|
||||
))
|
||||
}
|
||||
}
|
||||
'';
|
||||
in
|
||||
|
||||
pkgs.runCommand "${name}-dependency-analysis.svg"
|
||||
{
|
||||
nativeBuildInputs = [
|
||||
pkgs.buildPackages.graphviz
|
||||
];
|
||||
}
|
||||
"dot -Tsvg < ${gv} > $out";
|
||||
pkgs.runCommand "${name}-dependency-analysis.svg" {
|
||||
nativeBuildInputs = [
|
||||
pkgs.buildPackages.graphviz
|
||||
];
|
||||
} "dot -Tsvg < ${gv} > $out";
|
||||
in
|
||||
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue