312 lines
7.2 KiB
Nix
312 lines
7.2 KiB
Nix
{
|
|
pkgs ? import ../../.. {
|
|
config = { };
|
|
overlays = [ ];
|
|
},
|
|
lib ? pkgs.lib,
|
|
}:
|
|
let
|
|
fun = import ./maintainers.nix { inherit lib; };
|
|
utils = import ./utils.nix { inherit lib; };
|
|
|
|
mockPkgs =
|
|
{
|
|
packages ? [ ],
|
|
modules ? [ ],
|
|
githubTeams ? true,
|
|
}:
|
|
lib.updateManyAttrsByPath
|
|
(lib.imap0 (i: p: {
|
|
path = p;
|
|
update = _: {
|
|
meta.maintainersPosition.file = lib.concatStringsSep "/" p;
|
|
meta.nonTeamMaintainers = [ { githubId = i; } ];
|
|
meta.teams =
|
|
if githubTeams then [ { githubId = i + 100; } ] else [ { members = [ { githubId = i + 100; } ]; } ];
|
|
};
|
|
}) packages)
|
|
{
|
|
nixos =
|
|
{ }:
|
|
{
|
|
config.meta.maintainers = lib.listToAttrs (
|
|
lib.imap0 (i: m: lib.nameValuePair m [ { githubId = i; } ]) modules
|
|
);
|
|
config.meta.teams = lib.listToAttrs (
|
|
lib.imap0 (
|
|
i: m:
|
|
lib.nameValuePair m (
|
|
if githubTeams then [ { githubId = i + 100; } ] else [ { members = [ { githubId = i + 100; } ]; } ]
|
|
)
|
|
) modules
|
|
);
|
|
};
|
|
};
|
|
|
|
tests = {
|
|
testEmpty = {
|
|
expr = fun {
|
|
pkgs = mockPkgs { };
|
|
changedFiles = [ ];
|
|
affectedAttrPaths = [ ];
|
|
};
|
|
expected = {
|
|
packages = [ ];
|
|
teams = { };
|
|
users = { };
|
|
};
|
|
};
|
|
testNonExistentAffected = {
|
|
expr = fun {
|
|
pkgs = mockPkgs { };
|
|
changedFiles = [ "a" ];
|
|
affectedAttrPaths = [ [ "b" ] ];
|
|
};
|
|
expected = {
|
|
packages = [ ];
|
|
teams = { };
|
|
users = { };
|
|
};
|
|
};
|
|
testIrrelevantAffected = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
packages = [ [ "b" ] ];
|
|
};
|
|
changedFiles = [ "a" ];
|
|
affectedAttrPaths = [ [ "b" ] ];
|
|
};
|
|
expected = {
|
|
packages = [ ];
|
|
teams = { };
|
|
users = { };
|
|
};
|
|
};
|
|
testRelevantAffected = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
packages = [ [ "b" ] ];
|
|
};
|
|
# Also tests that subpaths work
|
|
changedFiles = [ "b/c" ];
|
|
affectedAttrPaths = [ [ "b" ] ];
|
|
};
|
|
expected = {
|
|
packages = [ [ "b" ] ];
|
|
teams."100" = [
|
|
{ attrPath = [ "b" ]; }
|
|
];
|
|
users."0" = [
|
|
{ attrPath = [ "b" ]; }
|
|
];
|
|
};
|
|
};
|
|
testRelevantAffectedNonGitHub = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
packages = [ [ "b" ] ];
|
|
githubTeams = false;
|
|
};
|
|
changedFiles = [ "b/c" ];
|
|
affectedAttrPaths = [ [ "b" ] ];
|
|
};
|
|
expected = {
|
|
packages = [ [ "b" ] ];
|
|
teams = { };
|
|
users."0" = [
|
|
{ attrPath = [ "b" ]; }
|
|
];
|
|
users."100" = [
|
|
{ attrPath = [ "b" ]; }
|
|
];
|
|
};
|
|
};
|
|
testByNameChanged = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
packages = [ [ "hello" ] ];
|
|
};
|
|
changedFiles = [ "pkgs/by-name/he/hello/sources.json" ];
|
|
affectedAttrPaths = [ ];
|
|
};
|
|
expected = {
|
|
packages = [ [ "hello" ] ];
|
|
teams."100" = [
|
|
{ attrPath = [ "hello" ]; }
|
|
];
|
|
users."0" = [
|
|
{ attrPath = [ "hello" ]; }
|
|
];
|
|
};
|
|
};
|
|
testByNameNonExistentChanged = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
packages = [ ];
|
|
};
|
|
# Happens when a new package was added to pkgs/by-name
|
|
changedFiles = [ "pkgs/by-name/he/hello/sources.json" ];
|
|
affectedAttrPaths = [ ];
|
|
};
|
|
expected = {
|
|
packages = [ ];
|
|
teams = { };
|
|
users = { };
|
|
};
|
|
};
|
|
testByNameReadmeChanged = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
packages = [ [ "hello" ] ];
|
|
};
|
|
changedFiles = [ "pkgs/by-name/README.md" ];
|
|
affectedAttrPaths = [ ];
|
|
};
|
|
expected = {
|
|
packages = [ ];
|
|
teams = { };
|
|
users = { };
|
|
};
|
|
};
|
|
testNoDuplicates = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
packages = [ [ "hello" ] ];
|
|
};
|
|
changedFiles = [
|
|
"hello"
|
|
"pkgs/by-name/he/hello/sources.json"
|
|
];
|
|
affectedAttrPaths = [ [ "hello" ] ];
|
|
};
|
|
expected = {
|
|
packages = [ [ "hello" ] ];
|
|
teams."100" = [
|
|
{ attrPath = [ "hello" ]; }
|
|
];
|
|
users."0" = [
|
|
{ attrPath = [ "hello" ]; }
|
|
];
|
|
};
|
|
};
|
|
testModuleMaintainers = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
modules = [ "a" ];
|
|
};
|
|
changedFiles = [ "a" ];
|
|
affectedAttrPaths = [ ];
|
|
};
|
|
expected = {
|
|
packages = [ ];
|
|
teams."100" = [
|
|
{ file = "a"; }
|
|
];
|
|
users."0" = [
|
|
{ file = "a"; }
|
|
];
|
|
};
|
|
};
|
|
testModuleMaintainersNonGithub = {
|
|
expr = fun {
|
|
pkgs = mockPkgs {
|
|
modules = [ "a" ];
|
|
githubTeams = false;
|
|
};
|
|
changedFiles = [ "a" ];
|
|
affectedAttrPaths = [ ];
|
|
};
|
|
expected = {
|
|
packages = [ ];
|
|
teams = { };
|
|
users."100" = [
|
|
{ file = "a"; }
|
|
];
|
|
users."0" = [
|
|
{ file = "a"; }
|
|
];
|
|
};
|
|
};
|
|
testGroupAttrdiffByPlatform = {
|
|
expr = utils.groupAttrdiffByPlatform {
|
|
added = [
|
|
"new-tool.aarch64-linux"
|
|
"new-tool.x86_64-darwin"
|
|
];
|
|
changed = [
|
|
"updated-tool.x86_64-darwin"
|
|
"shared-tool.x86_64-darwin"
|
|
];
|
|
removed = [
|
|
"removed-tool.aarch64-darwin"
|
|
"shared-tool.aarch64-darwin"
|
|
];
|
|
};
|
|
expected = {
|
|
aarch64-darwin = {
|
|
added = [ ];
|
|
changed = [ ];
|
|
removed = [
|
|
"removed-tool"
|
|
"shared-tool"
|
|
];
|
|
};
|
|
aarch64-linux = {
|
|
added = [ "new-tool" ];
|
|
changed = [ ];
|
|
removed = [ ];
|
|
};
|
|
x86_64-darwin = {
|
|
added = [ "new-tool" ];
|
|
changed = [
|
|
"shared-tool"
|
|
"updated-tool"
|
|
];
|
|
removed = [ ];
|
|
};
|
|
};
|
|
};
|
|
testGroupAttrdiffByKernel = {
|
|
expr =
|
|
let
|
|
grouped = utils.groupAttrdiffByKernel {
|
|
added = [
|
|
"new-tool.aarch64-linux"
|
|
"new-tool.x86_64-darwin"
|
|
];
|
|
changed = [
|
|
"updated-tool.x86_64-darwin"
|
|
"shared-tool.x86_64-darwin"
|
|
];
|
|
removed = [
|
|
"removed-tool.aarch64-darwin"
|
|
"shared-tool.aarch64-darwin"
|
|
];
|
|
};
|
|
in
|
|
lib.mapAttrs (_: diff: lib.mapAttrs (_: lib.sort lib.lessThan) diff) grouped;
|
|
expected = {
|
|
darwin = {
|
|
added = [ "new-tool" ];
|
|
changed = [
|
|
"shared-tool"
|
|
"updated-tool"
|
|
];
|
|
removed = [
|
|
"removed-tool"
|
|
"shared-tool"
|
|
];
|
|
};
|
|
linux = {
|
|
added = [ "new-tool" ];
|
|
changed = [ ];
|
|
removed = [ ];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
in
|
|
{
|
|
result = lib.runTests tests;
|
|
}
|