lib.teams: Sync from GitHub (members/shortName/scope) (#450864)

This commit is contained in:
Silvan Mosberger
2025-10-27 23:31:25 +00:00
committed by GitHub
11 changed files with 1274 additions and 362 deletions

81
.github/workflows/team.yml vendored Normal file
View File

@@ -0,0 +1,81 @@
name: Teams
on:
schedule:
# Every Tuesday at 19:42 (randomly chosen)
- cron: '42 19 * * 1'
# Allows manual trigger
workflow_dispatch:
permissions: {}
defaults:
run:
shell: bash
jobs:
sync:
runs-on: ubuntu-24.04-arm
steps:
- uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4
id: team-token
with:
app-id: ${{ vars.OWNER_APP_ID }}
private-key: ${{ secrets.OWNER_APP_PRIVATE_KEY }}
permission-administration: read
permission-members: read
- name: Fetch source
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
sparse-checkout: |
ci/github-script
maintainers/github-teams.json
- name: Install dependencies
run: npm install bottleneck
- name: Synchronise teams
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
github-token: ${{ steps.team-token.outputs.token }}
script: |
require('./ci/github-script/get-teams.js')({
github,
context,
core,
outFile: "maintainers/github-teams.json"
})
# Use a GitHub App to create the PR so that CI gets triggered
- uses: actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42 # v2.1.4
id: sync-token
with:
app-id: ${{ vars.NIXPKGS_CI_APP_ID }}
private-key: ${{ secrets.NIXPKGS_CI_APP_PRIVATE_KEY }}
permission-contents: write
permission-pull-requests: write
- name: Get GitHub App User Git String
id: user
env:
GH_TOKEN: ${{ steps.sync-token.outputs.token }}
APP_SLUG: ${{ steps.sync-token.outputs.app-slug }}
run: |
name="${APP_SLUG}[bot]"
userId=$(gh api "/users/$name" --jq .id)
email="$userId+$name@users.noreply.github.com"
echo "git-string=$name <$email>" >> "$GITHUB_OUTPUT"
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
token: ${{ steps.sync-token.outputs.token }}
add-paths: maintainers/github-teams.json
author: ${{ steps.user.outputs.git-string }}
committer: ${{ steps.user.outputs.git-string }}
commit-message: "maintainers/github-teams.json: Automated sync"
branch: github-team-sync
title: "maintainers/github-teams.json: Automated sync"
body: |
This is an automated PR to sync the GitHub teams with access to this repository to the `lib.teams` list.
This PR can be merged without taking any further action.

View File

@@ -32,6 +32,8 @@
/lib/asserts.nix @infinisil @hsjobeki @Profpatsch
/lib/path/* @infinisil @hsjobeki
/lib/fileset @infinisil @hsjobeki
/maintainers/github-teams.json @infinisil
/maintainers/computed-team-list.nix @infinisil
## Standard environmentrelated libraries
/lib/customisation.nix @alyssais @NixOS/stdenv
/lib/derivations.nix @alyssais @NixOS/stdenv

82
ci/github-script/get-teams.js Executable file
View File

@@ -0,0 +1,82 @@
const excludeTeams = [
/^voters.*$/,
/^nixpkgs-maintainers$/,
/^nixpkgs-committers$/,
]
module.exports = async ({ github, context, core, outFile }) => {
const withRateLimit = require('./withRateLimit.js')
const { writeFileSync } = require('node:fs')
const result = {}
await withRateLimit({ github, core }, async (_stats) => {
/// Turn an Array of users into an Object, mapping user.login -> user.id
function makeUserSet(users) {
// Sort in-place and build result by mutation
users.sort((a, b) => (a.login > b.login ? 1 : -1))
return users.reduce((acc, user) => {
acc[user.login] = user.id
return acc
}, {})
}
/// Process a list of teams and append to the result variable
async function processTeams(teams) {
for (const team of teams) {
core.notice(`Processing team ${team.slug}`)
if (!excludeTeams.some((regex) => team.slug.match(regex))) {
const members = makeUserSet(
await github.paginate(github.rest.teams.listMembersInOrg, {
org: context.repo.owner,
team_slug: team.slug,
role: 'member',
}),
)
const maintainers = makeUserSet(
await github.paginate(github.rest.teams.listMembersInOrg, {
org: context.repo.owner,
team_slug: team.slug,
role: 'maintainer',
}),
)
result[team.slug] = {
description: team.description,
id: team.id,
maintainers,
members,
name: team.name,
}
}
await processTeams(
await github.paginate(github.rest.teams.listChildInOrg, {
org: context.repo.owner,
team_slug: team.slug,
}),
)
}
}
const teams = await github.paginate(github.rest.repos.listTeams, {
owner: context.repo.owner,
repo: context.repo.repo,
})
await processTeams(teams)
})
// Sort the teams by team name
const sorted = Object.keys(result)
.sort()
.reduce((acc, key) => {
acc[key] = result[key]
return acc
}, {})
const json = `${JSON.stringify(sorted, null, 2)}\n`
if (outFile) {
writeFileSync(outFile, json)
} else {
console.log(json)
}
}

View File

@@ -83,4 +83,16 @@ program
}
})
program
.command('get-teams')
.description('Fetch the list of teams with GitHub and output it to a file')
.argument('<owner>', 'Owner of the GitHub repository to label (Example: NixOS)')
.argument('<repo>', 'Name of the GitHub repository to label (Example: nixpkgs)')
.argument('[outFile]', 'Path to the output file (Example: github-teams.json). If not set, prints to stdout')
.action(async (owner, repo, outFile, options) => {
const getTeams = (await import('./get-teams.js')).default
// TODO: Refactor this file so we don't need to pass a PR
await run(getTeams, owner, repo, undefined, { ...options, outFile })
})
await program.parse()

View File

@@ -63,7 +63,7 @@ let
customisation = callLibs ./customisation.nix;
derivations = callLibs ./derivations.nix;
maintainers = import ../maintainers/maintainer-list.nix;
teams = callLibs ../maintainers/team-list.nix;
teams = callLibs ../maintainers/computed-team-list.nix;
meta = callLibs ./meta.nix;
versions = callLibs ./versions.nix;

View File

@@ -24,13 +24,21 @@ let
default = false;
};
members = lib.mkOption {
type = types.listOf (types.submodule (import ./maintainer-module.nix { inherit lib; }));
type = types.listOf (types.submodule ./maintainer-module.nix);
default = [ ];
};
github = lib.mkOption {
type = types.str;
default = "";
};
githubId = lib.mkOption {
type = types.int;
default = 0;
};
githubMaintainers = lib.mkOption {
type = types.listOf (types.submodule ./maintainer-module.nix);
default = [ ];
};
};
};

View File

@@ -158,13 +158,17 @@ If the team lists no specific membership policy, feel free to merge changes to t
> [!IMPORTANT]
> If a team says it is a closed group, do not merge additions to the team without an approval by at least one existing member.
A corresponding GitHub team can be created by any org member.
#### Synced GitHub teams
As an alternative to tracking team members in `team-list.nix`, a corresponding GitHub team can be created by any org member and its members subsequently managed directly on GitHub.
When creating the team it should be created with the `nixpkgs-maintainers` team as parent.
Once approved, the team will have the right privileges to be pinged and requested for review in Nixpkgs.
> [!TIP]
> The team name should be as short as possible; because it is nested under the maintainers group, no -maintainers suffix is needed.
After the first [weekly team sync](../.github/workflows/team-sync.yml) with the new team, it's then also possible to link it to the entry in `team-list.nix` by setting its `github` field to the GitHub team name.
# Maintainer scripts
Various utility scripts, which are mainly useful for nixpkgs maintainers, are available under `./scripts/`.

View File

@@ -0,0 +1,59 @@
# Extends ./team-list.nix with synced GitHub information from ./github-teams.json
{ lib }:
let
githubTeams = lib.importJSON ./github-teams.json;
teams = import ./team-list.nix { inherit lib; };
# A fast maintainer id lookup table
maintainersById = lib.pipe lib.maintainers [
lib.attrValues
(lib.groupBy (attrs: toString attrs.githubId))
(lib.mapAttrs (_: lib.head))
];
maintainerSetToList =
githubTeam:
lib.mapAttrsToList (
login: id:
maintainersById.${toString id}
or (throw "lib.teams: No maintainer entry for GitHub user @${login} who's part of the @NixOS/${githubTeam} team")
);
in
# TODO: Consider automatically exposing all GitHub teams under `lib.teams`,
# so that no manual PRs are necessary to add such teams anymore
lib.mapAttrs (
name: attrs:
if attrs ? github then
let
githubTeam =
githubTeams.${attrs.github}
or (throw "lib.teams.${name}: Corresponding GitHub team ${attrs.github} not known yet, make sure to create it and wait for the regular team sync");
in
# TODO: Consider specifying `githubId` in team-list.nix and inferring `github` from it (or even dropping it)
# This would make renames easier because no additional place needs to keep track of them.
# Though in a future where all Nixpkgs GitHub teams are automatically exposed under `lib.teams`,
# this would also not be an issue anymore.
assert lib.assertMsg (!attrs ? githubId)
"lib.teams.${name}: Both `githubId` and `github` is set, but the former is synced from the latter";
assert lib.assertMsg (!attrs ? shortName)
"lib.teams.${name}: Both `shortName` and `github` is set, but the former is synced from the latter";
assert lib.assertMsg (
!attrs ? scope
) "lib.teams.${name}: Both `scope` and `github` is set, but the former is synced from the latter";
assert lib.assertMsg (
!attrs ? members
) "lib.teams.${name}: Both `members` and `github` is set, but the former is synced from the latter";
attrs
// {
githubId = githubTeam.id;
shortName = githubTeam.name;
scope = githubTeam.description;
members =
maintainerSetToList attrs.github githubTeam.maintainers
++ maintainerSetToList attrs.github githubTeam.members;
githubMaintainers = maintainerSetToList attrs.github githubTeam.maintainers;
}
else
attrs
) teams

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,11 @@
#!/usr/bin/env nix-shell
#!nix-shell -i perl -p perl -p perlPackages.JSON perlPackages.LWPUserAgent perlPackages.LWPProtocolHttps perlPackages.TermReadKey
#!nix-shell -i perl -p perl -p perlPackages.JSON github-cli
# This script generates a list of teams to ping for the Feature Freeze announcement on Discourse.
# It's intended to be used by Release Managers before creating such posts.
#
# The script interactively reads a GitHub username and a corresponding GitHub Personal Access token.
# This is required to access the GitHub Teams API so the token needs at least the read:org privilege.
# The script uses the credentials from the GitHub CLI (gh)
# This is required to access the GitHub Teams API so it needs at least the read:org privilege.
## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::ProhibitBacktickOperators)
use strict;
@@ -14,39 +14,21 @@ use Carp;
use Cwd 'abs_path';
use File::Basename;
use JSON qw(decode_json);
use LWP::UserAgent;
use Term::ReadKey qw(ReadLine ReadMode);
sub github_team_members {
my ($team_name, $username, $token) = @_;
my ($team_name) = @_;
my @ret;
my $req = HTTP::Request->new('GET', "https://api.github.com/orgs/NixOS/teams/$team_name/members", [ 'Accept' => 'application/vnd.github.v3+json' ]);
$req->authorization_basic($username, $token);
my $response = LWP::UserAgent->new->request($req);
if ($response->is_success) {
my $content = decode_json($response->decoded_content);
my $content = decode_json(`gh api orgs/NixOS/teams/$team_name/members`);
foreach (@{$content}) {
push @ret, $_->{'login'};
}
} else {
print {*STDERR} "!! Requesting members of GitHub Team '$team_name' failed: " . $response->status_line;
}
return \@ret;
}
# Read GitHub credentials
print {*STDERR} 'GitHub username: ';
my $github_user = ReadLine(0);
ReadMode('noecho');
print {*STDERR} 'GitHub personal access token (no echo): ';
my $github_token = ReadLine(0);
ReadMode('restore');
print {*STDERR} "\n";
chomp $github_user;
chomp $github_token;
`gh auth status` or die "`gh` comes from `pkgs.github-cli`, or in one command:
nix-shell -p github-cli --run 'gh auth login'\n";
# Read nix output
my $nix_version = `nix --version`;
@@ -60,7 +42,6 @@ if ($nix_version =~ m/2[.]3[.]/msx) {
my $data = decode_json($out);
# Process teams
print {*STDERR} "\n";
while (my ($team_nix_key, $team_config) = each %{$data}) {
# Ignore teams that don't want to be or can't be pinged
if (not defined $team_config->{enableFeatureFreezePing} or not $team_config->{enableFeatureFreezePing}) {
@@ -71,12 +52,12 @@ while (my ($team_nix_key, $team_config) = each %{$data}) {
next;
}
# Team name
print {*STDERR} "$team_config->{shortName}:";
print {*STDOUT} "$team_config->{shortName}:";
# GitHub Teams
my @github_members;
if (defined $team_config->{github}) {
print {*STDERR} " \@NixOS/$team_config->{github}";
push @github_members, @{github_team_members($team_config->{github}, $github_user, $github_token)};
print {*STDOUT} " \@NixOS/$team_config->{github}";
push @github_members, @{github_team_members($team_config->{github})};
}
my %github_members = map { $_ => 1 } @github_members;
# Members
@@ -88,9 +69,11 @@ while (my ($team_nix_key, $team_config) = each %{$data}) {
if (defined $github_members{$github_handle}) {
next;
}
print {*STDERR} " \@$github_handle";
print {*STDOUT} " \@$github_handle";
}
}
print {*STDERR} "\n";
print {*STDOUT} "\n";
}
print {*STDOUT} "Everyone else: \@NixOS/nixpkgs-committers\n";

View File

@@ -1,11 +1,9 @@
/*
List of maintainer teams.
name = {
# Required
members = [ maintainer1 maintainer2 ];
scope = "Maintain foo packages.";
shortName = "foo";
# Optional
enableFeatureFreezePing = true;
github = "my-subsystem";
};
@@ -18,7 +16,12 @@
- `enableFeatureFreezePing` will ping this team during the Feature Freeze announcements on releases
- There is limited mention capacity in a single post, so this should be reserved for critical components
or larger ecosystems within nixpkgs.
- `github` will ping the specified GitHub team as well
- `github` will ping the specified GitHub team and sync the `members`, `scope` and `shortName` fields from it
- `githubId` will be set automatically based on `github`
If `github` is specified and you'd like to be added to the team, contact one of the `githubMaintainers` of the team:
nix eval -f lib teams.someTeam.githubMaintainers --json | jq
More fields may be added in the future.
@@ -56,16 +59,7 @@ with lib.maintainers;
};
android = {
members = [
adrian-gierakowski
hadilq
johnrtitor
numinit
RossComputerGuy
];
scope = "Maintain Android-related tooling in nixpkgs.";
github = "android";
shortName = "Android";
enableFeatureFreezePing = true;
};
@@ -106,20 +100,7 @@ with lib.maintainers;
};
beam = {
members = [
adamcstephens
ankhers
Br1ght0ne
DianaOlympos
gleber
happysalada
minijackson
yurrriq
savtrip
];
github = "beam";
scope = "Maintain BEAM-related packages and modules.";
shortName = "BEAM";
enableFeatureFreezePing = true;
};
@@ -193,34 +174,11 @@ with lib.maintainers;
};
categorization = {
members = [
aleksana
fgaz
getpsyched
lyndeno
natsukium
philiptaron
pyrotelekinetic
raskin
sigmasquadron
tomodachi94
];
github = "categorization";
scope = "Maintain the categorization system in Nixpkgs, per RFC 146. This team has authority over all categorization issues in Nixpkgs.";
shortName = "Categorization";
};
ci = {
members = [
MattSturgeon
mic92
philiptaron
wolfgangwalther
zowoq
];
github = "nixpkgs-ci";
scope = "Maintain Nixpkgs' in-tree Continuous Integration, including GitHub Actions.";
shortName = "CI";
};
cinnamon = {
@@ -237,7 +195,6 @@ with lib.maintainers;
members = [ floriansanderscc ];
scope = "Maintain Clever Cloud related packages.";
shortName = "CleverCloud";
github = "CleverCloud";
};
cloudposse = {
@@ -263,21 +220,7 @@ with lib.maintainers;
};
cosmic = {
members = [
a-kenji
ahoneybun
drakon64
griffi-gh
HeitorAugustoLN
nyabinary
pandapip1
qyliss
thefossguy
michaelBelsanti
];
github = "cosmic";
shortName = "cosmic";
scope = "Maintain the COSMIC DE and related packages.";
enableFeatureFreezePing = true;
};
@@ -291,15 +234,6 @@ with lib.maintainers;
};
cuda = {
members = [
connorbaker
GaetanLepage
prusnak
samuela
SomeoneSerge
];
scope = "Maintain CUDA-enabled packages";
shortName = "Cuda";
github = "cuda-maintainers";
};
@@ -316,14 +250,7 @@ with lib.maintainers;
};
darwin = {
members = [
emily
reckenrode
toonn
];
github = "darwin-core";
scope = "Maintain core platform support and packages for macOS and other Apple platforms.";
shortName = "Darwin";
enableFeatureFreezePing = true;
};
@@ -367,10 +294,7 @@ with lib.maintainers;
};
docs = {
members = [ ];
github = "documentation-team";
scope = "Maintain nixpkgs/NixOS documentation and tools for building it.";
shortName = "Docs";
enableFeatureFreezePing = true;
};
@@ -411,31 +335,11 @@ with lib.maintainers;
};
enlightenment = {
members = [ romildo ];
github = "enlightenment";
scope = "Maintain Enlightenment desktop environment and related packages.";
shortName = "Enlightenment";
enableFeatureFreezePing = true;
};
# Dummy group for the "everyone else" section
feature-freeze-everyone-else = {
members = [ ];
github = "nixpkgs-committers";
scope = "Dummy team for the #everyone else' section during feture freezes, not to be used as package maintainers!";
shortName = "Everyone else";
enableFeatureFreezePing = true;
};
flutter = {
members = [
mkg20001
RossComputerGuy
FlafyDev
hacker1024
];
scope = "Maintain Flutter and Dart-related packages and build tools";
shortName = "flutter";
enableFeatureFreezePing = false;
github = "flutter";
};
@@ -496,18 +400,7 @@ with lib.maintainers;
};
geospatial = {
members = [
autra
imincik
l0b0
nh2
nialov
sikmir
willcohen
];
github = "geospatial";
scope = "Maintain geospatial, remote sensing and OpenStreetMap software.";
shortName = "Geospatial";
enableFeatureFreezePing = true;
};
@@ -524,15 +417,7 @@ with lib.maintainers;
};
gnome = {
members = [
bobby285271
hedning
jtojnar
dasj19
];
github = "gnome";
scope = "Maintain GNOME desktop environment and platform.";
shortName = "GNOME";
enableFeatureFreezePing = true;
};
@@ -547,17 +432,7 @@ with lib.maintainers;
};
golang = {
members = [
kalbasit
katexochen
mic92
zowoq
qbit
mfrw
];
github = "golang";
scope = "Maintain Golang compilers.";
shortName = "Go";
enableFeatureFreezePing = true;
};
@@ -573,15 +448,7 @@ with lib.maintainers;
};
haskell = {
members = [
cdepillabout
maralorn
sternenseemann
wolfgangwalther
];
github = "haskell";
scope = "Maintain Haskell packages and infrastructure.";
shortName = "Haskell";
enableFeatureFreezePing = true;
};
@@ -607,16 +474,7 @@ with lib.maintainers;
};
hyprland = {
members = [
donovanglover
fufexan
johnrtitor
khaneliman
NotAShelf
];
github = "hyprland";
scope = "Maintain Hyprland compositor and ecosystem";
shortName = "Hyprland";
enableFeatureFreezePing = true;
};
@@ -638,14 +496,6 @@ with lib.maintainers;
java = {
github = "java";
members = [
chayleaf
fliegendewurst
infinidoge
tomodachi94
];
shortName = "Java";
scope = "Maintainers of the Nixpkgs Java ecosystem (JDK, JVM, Java, Gradle, Maven, Ant, and adjacent projects)";
enableFeatureFreezePing = true;
};
@@ -684,17 +534,6 @@ with lib.maintainers;
k3s = {
github = "k3s";
members = [
euank
frederictobiasc
heywoodlh
marcusramberg
mic92
rorosen
wrmilling
];
scope = "Maintain K3s package, NixOS module, NixOS tests, update script";
shortName = "K3s";
};
kodi = {
@@ -746,16 +585,7 @@ with lib.maintainers;
};
lisp = {
members = [
raskin
lukego
nagy
uthar
hraban
];
github = "lisp";
scope = "Maintain the Lisp ecosystem.";
shortName = "lisp";
enableFeatureFreezePing = true;
};
@@ -773,19 +603,7 @@ with lib.maintainers;
};
llvm = {
members = [
dtzWill
emily
ericson2314
lovek323
qyliss
RossComputerGuy
rrbutani
sternenseemann
];
github = "llvm";
scope = "Maintain LLVM package sets and related packages";
shortName = "LLVM";
enableFeatureFreezePing = true;
};
@@ -797,23 +615,12 @@ with lib.maintainers;
};
loongarch64 = {
members = [
aleksana
Cryolitia
darkyzhou
dramforever
wegank
];
github = "loongarch64";
scope = "Maintain LoongArch64 related packages and code";
shortName = "LoongArch64";
enableFeatureFreezePing = true;
};
lua = {
github = "lua";
scope = "Maintain the lua ecosystem.";
shortName = "lua";
enableFeatureFreezePing = true;
};
@@ -828,10 +635,7 @@ with lib.maintainers;
};
lumina = {
members = [ romildo ];
github = "lumina";
scope = "Maintain lumina desktop environment and related packages.";
shortName = "Lumina";
enableFeatureFreezePing = true;
};
@@ -847,23 +651,12 @@ with lib.maintainers;
};
lxqt = {
members = [ romildo ];
github = "lxqt";
scope = "Maintain LXQt desktop environment and related packages.";
shortName = "LXQt";
enableFeatureFreezePing = true;
};
marketing = {
members = [
djacu
flyfloh
thilobillerbeck
tomberek
];
github = "marketing-team";
scope = "Marketing of Nix/NixOS/nixpkgs.";
shortName = "Marketing";
enableFeatureFreezePing = true;
};
@@ -927,15 +720,7 @@ with lib.maintainers;
};
neovim = {
members = [
GaetanLepage
khaneliman
mrcjkb
perchun
];
github = "neovim";
scope = "Maintain the vim and neovim text editors and related packages.";
shortName = "Vim/Neovim";
};
nextcloud = {
@@ -993,13 +778,7 @@ with lib.maintainers;
};
ocaml = {
members = [
alizter
redianthus
];
github = "ocaml";
scope = "Maintain the OCaml compiler and package set.";
shortName = "OCaml";
enableFeatureFreezePing = true;
};
@@ -1031,13 +810,7 @@ with lib.maintainers;
};
pantheon = {
members = [
davidak
bobby285271
];
github = "pantheon";
scope = "Maintain Pantheon desktop environment and platform.";
shortName = "Pantheon";
enableFeatureFreezePing = true;
};
@@ -1053,26 +826,12 @@ with lib.maintainers;
};
php = {
members = [
aanderse
ma27
piotrkwiecinski
talyz
];
github = "php";
scope = "Maintain PHP related packages and extensions.";
shortName = "PHP";
enableFeatureFreezePing = true;
};
podman = {
members = [
saschagrunert
vdemeester
];
github = "podman";
scope = "Maintain Podman and CRI-O related packages and modules.";
shortName = "Podman";
};
postgres = {
@@ -1097,18 +856,7 @@ with lib.maintainers;
};
qt-kde = {
members = [
ilya-fedin
k900
LunNova
mjm
nickcao
SuperSandro2000
ttuegel
];
github = "qt-kde";
scope = "Maintain the Qt framework, KDE application suite, Plasma desktop environment and related projects.";
shortName = "Qt / KDE";
enableFeatureFreezePing = true;
};
@@ -1134,43 +882,12 @@ with lib.maintainers;
shortName = "Red Code Labs";
};
release = {
members = [ ];
github = "nixos-release-managers";
scope = "Manage the current nixpkgs/NixOS release.";
shortName = "Release";
};
rocm = {
members = [
Flakebi
GZGavinZhao
LunNova
mschwaig
];
github = "rocm";
scope = "Maintain ROCm and related packages.";
shortName = "ROCm";
};
ruby = {
members = [ ];
scope = "Maintain the Ruby interpreter and related packages.";
shortName = "Ruby";
enableFeatureFreezePing = true;
};
rust = {
members = [
figsoda
mic92
tjni
winter
zowoq
];
github = "rust";
scope = "Maintain the Rust compiler toolchain and nixpkgs integration.";
shortName = "Rust";
enableFeatureFreezePing = true;
};
@@ -1185,16 +902,7 @@ with lib.maintainers;
};
sdl = {
members = [
evythedemon
grimmauld
jansol
marcin-serwin
pbsds
];
github = "SDL";
scope = "Maintain core SDL libraries.";
shortName = "SDL";
github = "sdl";
enableFeatureFreezePing = true;
};
@@ -1221,16 +929,6 @@ with lib.maintainers;
};
stdenv = {
members = [
artturin
emily
ericson2314
philiptaron
reckenrode
RossComputerGuy
];
scope = "Maintain the standard environment and its surrounding logic.";
shortName = "stdenv";
enableFeatureFreezePing = true;
github = "stdenv";
};
@@ -1267,16 +965,7 @@ with lib.maintainers;
};
systemd = {
members = [
flokli
arianvp
elvishjerricco
aanderse
grimmauld
];
github = "systemd";
scope = "Maintain systemd for NixOS.";
shortName = "systemd";
enableFeatureFreezePing = true;
};
@@ -1326,14 +1015,6 @@ with lib.maintainers;
};
xen = {
members = [
hehongbo
lach
sigmasquadron
rane
];
scope = "Maintain the Xen Project Hypervisor and the related tooling ecosystem.";
shortName = "Xen Project Hypervisor";
enableFeatureFreezePing = true;
github = "xen-project";
};