at 24.05-pre 2.2 kB view raw
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)