summaryrefslogtreecommitdiff
path: root/ofborg/tickborg/src/maintainers.nix
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