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