1{ pkgs, nixpkgs ? { }, libsets }:
2let
3 revision = pkgs.lib.trivial.revisionWithDefault (nixpkgs.rev or "master");
4
5 libDefPos = prefix: set:
6 builtins.concatMap
7 (name: [{
8 name = builtins.concatStringsSep "." (prefix ++ [name]);
9 location = builtins.unsafeGetAttrPos name set;
10 }] ++ nixpkgsLib.optionals
11 (builtins.length prefix == 0 && builtins.isAttrs set.${name})
12 (libDefPos (prefix ++ [name]) set.${name})
13 ) (builtins.attrNames set);
14
15 libset = toplib:
16 builtins.map
17 (subsetname: {
18 subsetname = subsetname;
19 functions = libDefPos [] toplib.${subsetname};
20 })
21 (builtins.map (x: x.name) libsets);
22
23 nixpkgsLib = pkgs.lib;
24
25 flattenedLibSubset = { subsetname, functions }:
26 builtins.map
27 (fn: {
28 name = "lib.${subsetname}.${fn.name}";
29 value = fn.location;
30 })
31 functions;
32
33 locatedlibsets = libs: builtins.map flattenedLibSubset (libset libs);
34 removeFilenamePrefix = prefix: filename:
35 let
36 prefixLen = (builtins.stringLength prefix) + 1; # +1 to remove the leading /
37 filenameLen = builtins.stringLength filename;
38 substr = builtins.substring prefixLen filenameLen filename;
39 in substr;
40
41 removeNixpkgs = removeFilenamePrefix (builtins.toString pkgs.path);
42
43 liblocations =
44 builtins.filter
45 (elem: elem.value != null)
46 (nixpkgsLib.lists.flatten
47 (locatedlibsets nixpkgsLib));
48
49 fnLocationRelative = { name, value }:
50 {
51 inherit name;
52 value = value // { file = removeNixpkgs value.file; };
53 };
54
55 relativeLocs = (builtins.map fnLocationRelative liblocations);
56 sanitizeId = builtins.replaceStrings
57 [ "'" ]
58 [ "-prime" ];
59
60 urlPrefix = "https://github.com/NixOS/nixpkgs/blob/${revision}";
61 jsonLocs = builtins.listToAttrs
62 (builtins.map
63 ({ name, value }: {
64 name = sanitizeId name;
65 value =
66 let
67 text = "${value.file}:${builtins.toString value.line}";
68 target = "${urlPrefix}/${value.file}#L${builtins.toString value.line}";
69 in
70 "[${text}](${target}) in `<nixpkgs>`";
71 })
72 relativeLocs);
73
74in
75pkgs.writeText "locations.json" (builtins.toJSON jsonLocs)