lol

Improve compare performance (#377434)

authored by

Silvan Mosberger and committed by
GitHub
6f27cf11 43de826f

+16 -46
+2 -3
ci/eval/compare/default.nix
··· 69 69 groupByPlatform 70 70 extractPackageNames 71 71 getLabels 72 - uniqueStrings 73 72 ; 74 73 75 74 getAttrs = dir: builtins.fromJSON (builtins.readFile "${dir}/outpaths.json"); ··· 81 80 # - values: lists of `packagePlatformPath`s 82 81 diffAttrs = diff beforeAttrs afterAttrs; 83 82 84 - rebuilds = uniqueStrings (diffAttrs.added ++ diffAttrs.changed); 83 + rebuilds = diffAttrs.added ++ diffAttrs.changed; 85 84 rebuildsPackagePlatformAttrs = convertToPackagePlatformAttrs rebuilds; 86 85 87 86 changed-paths = ··· 110 109 ); 111 110 112 111 maintainers = import ./maintainers.nix { 113 - changedattrs = lib.unique (map (a: a.packagePath) rebuildsPackagePlatformAttrs); 112 + changedattrs = lib.attrNames (lib.groupBy (a: a.name) rebuildsPackagePlatformAttrs); 114 113 changedpathsjson = touchedFilesJson; 115 114 }; 116 115 in
+14 -43
ci/eval/compare/maintainers.nix
··· 11 11 changedpaths = builtins.fromJSON (builtins.readFile changedpathsjson); 12 12 13 13 anyMatchingFile = 14 - filename: 15 - let 16 - matching = builtins.filter (changed: lib.strings.hasSuffix changed filename) changedpaths; 17 - in 18 - (builtins.length matching) > 0; 14 + filename: builtins.any (changed: lib.strings.hasSuffix changed filename) changedpaths; 19 15 20 - anyMatchingFiles = files: (builtins.length (builtins.filter anyMatchingFile files)) > 0; 16 + anyMatchingFiles = files: builtins.any anyMatchingFile files; 21 17 22 - enrichedAttrs = builtins.map (path: { 23 - path = path; 24 - name = builtins.concatStringsSep "." path; 18 + enrichedAttrs = builtins.map (name: { 19 + path = lib.splitString "." name; 20 + name = name; 25 21 }) changedattrs; 26 22 27 23 validPackageAttributes = builtins.filter ( ··· 45 41 pkg: pkg // { maintainers = (pkg.package.meta or { }).maintainers or [ ]; } 46 42 ) attrsWithPackages; 47 43 48 - attrsWeCanPing = builtins.filter ( 49 - pkg: 50 - if (builtins.length pkg.maintainers) > 0 then 51 - true 52 - else 53 - builtins.trace "Package has no maintainers: ${pkg.name}" false 54 - ) attrsWithMaintainers; 55 - 56 44 relevantFilenames = 57 45 drv: 58 46 (lib.lists.unique ( ··· 88 76 89 77 attrsWithModifiedFiles = builtins.filter (pkg: anyMatchingFiles pkg.filenames) attrsWithFilenames; 90 78 91 - listToPing = lib.lists.flatten ( 92 - builtins.map ( 93 - pkg: 94 - builtins.map (maintainer: { 95 - id = maintainer.githubId; 96 - packageName = pkg.name; 97 - dueToFiles = pkg.filenames; 98 - }) pkg.maintainers 99 - ) attrsWithModifiedFiles 100 - ); 101 - 102 - byMaintainer = lib.lists.foldr ( 103 - ping: collector: 104 - collector 105 - // { 106 - "${toString ping.id}" = [ 107 - { inherit (ping) packageName dueToFiles; } 108 - ] ++ (collector."${toString ping.id}" or [ ]); 109 - } 110 - ) { } listToPing; 111 - 112 - textForPackages = 113 - packages: lib.strings.concatStringsSep ", " (builtins.map (pkg: pkg.packageName) packages); 79 + listToPing = lib.concatMap ( 80 + pkg: 81 + builtins.map (maintainer: { 82 + id = maintainer.githubId; 83 + packageName = pkg.name; 84 + dueToFiles = pkg.filenames; 85 + }) pkg.maintainers 86 + ) attrsWithModifiedFiles; 114 87 115 - textPerMaintainer = lib.attrsets.mapAttrs ( 116 - maintainer: packages: "- @${maintainer} for ${textForPackages packages}" 117 - ) byMaintainer; 88 + byMaintainer = lib.groupBy (ping: toString ping.id) listToPing; 118 89 119 90 packagesPerMaintainer = lib.attrsets.mapAttrs ( 120 91 maintainer: packages: builtins.map (pkg: pkg.packageName) packages