blob: 85dc8d85b45422cce6cd2e2e65efb54763f9b7e6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
{ changedattrsjson, changedpathsjson }:
let
pkgs = import ./. {};
changedattrs = builtins.fromJSON (builtins.readFile changedattrsjson);
changedpaths = builtins.fromJSON (builtins.readFile changedpathsjson);
anyMatchingFile = filename:
let
matching = builtins.filter
(changed: pkgs.lib.strings.hasSuffix changed filename)
changedpaths;
in (builtins.length matching) > 0;
anyMatchingFiles = files:
(builtins.length (builtins.filter anyMatchingFile files)) > 0;
enrichedAttrs = builtins.map
(path: {
path = path;
name = builtins.concatStringsSep "." path;
})
changedattrs;
validPackageAttributes = builtins.filter
(pkg:
if (pkgs.lib.attrsets.hasAttrByPath pkg.path pkgs)
then (if (builtins.tryEval (pkgs.lib.attrsets.attrByPath pkg.path null pkgs)).success
then true
else builtins.trace "Failed to access ${pkg.name} even though it exists" false)
else builtins.trace "Failed to locate ${pkg.name}." false
)
enrichedAttrs;
attrsWithPackages = builtins.map
(pkg: pkg // { package = pkgs.lib.attrsets.attrByPath pkg.path null pkgs; })
validPackageAttributes;
attrsWithMaintainers = builtins.map
(pkg: pkg // { maintainers = (pkg.package.meta or {}).maintainers or []; })
attrsWithPackages;
attrsWeCanPing = builtins.filter
(pkg: if (builtins.length pkg.maintainers) > 0
then true
else builtins.trace "Package has no maintainers: ${pkg.name}" false
)
attrsWithMaintainers;
relevantFilenames = drv:
(pkgs.lib.lists.unique
(builtins.map
(pos: pos.file)
(builtins.filter (x: x != null)
[
(builtins.unsafeGetAttrPos "maintainers" (drv.meta or {}))
(builtins.unsafeGetAttrPos "src" drv)
# broken because name is always set by stdenv:
# # A hack to make `nix-env -qa` and `nix search` ignore broken packages.
# # TODO(@oxij): remove this assert when something like NixOS/nix#1771 gets merged into nix.
# name = assert validity.handled; name + lib.optionalString
#(builtins.unsafeGetAttrPos "name" drv)
(builtins.unsafeGetAttrPos "pname" drv)
(builtins.unsafeGetAttrPos "version" drv)
# Use ".meta.position" for cases when most of the package is
# defined in a "common" section and the only place where
# reference to the file with a derivation the "pos"
# attribute.
#
# ".meta.position" has the following form:
# "pkgs/tools/package-management/nix/default.nix:155"
# We transform it to the following:
# { file = "pkgs/tools/package-management/nix/default.nix"; }
{ file = pkgs.lib.head (pkgs.lib.splitString ":" (drv.meta.position or "")); }
]
)));
attrsWithFilenames = builtins.map
(pkg: pkg // { filenames = relevantFilenames pkg.package; })
attrsWithMaintainers;
attrsWithModifiedFiles = builtins.filter
(pkg: anyMatchingFiles pkg.filenames)
attrsWithFilenames;
listToPing = pkgs.lib.lists.flatten
(builtins.map
(pkg:
builtins.map (maintainer: {
handle = pkgs.lib.toLower maintainer.github;
packageName = pkg.name;
dueToFiles = pkg.filenames;
})
pkg.maintainers
)
attrsWithModifiedFiles);
byMaintainer = pkgs.lib.lists.foldr
(ping: collector: collector // { "${ping.handle}" = [ { inherit (ping) packageName dueToFiles; } ] ++ (collector."${ping.handle}" or []); })
{}
listToPing;
textForPackages = packages:
pkgs.lib.strings.concatStringsSep ", " (
builtins.map (pkg: pkg.packageName)
packages);
textPerMaintainer = pkgs.lib.attrsets.mapAttrs
(maintainer: packages: "- @${maintainer} for ${textForPackages packages}")
byMaintainer;
packagesPerMaintainer = pkgs.lib.attrsets.mapAttrs
(maintainer: packages:
builtins.map (pkg: pkg.packageName)
packages)
byMaintainer;
in packagesPerMaintainer
|