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/asserts.nix @infinisil @hsjobeki @Profpatsch
/lib/path/* @infinisil @hsjobeki /lib/path/* @infinisil @hsjobeki
/lib/fileset @infinisil @hsjobeki /lib/fileset @infinisil @hsjobeki
/maintainers/github-teams.json @infinisil
/maintainers/computed-team-list.nix @infinisil
## Standard environmentrelated libraries ## Standard environmentrelated libraries
/lib/customisation.nix @alyssais @NixOS/stdenv /lib/customisation.nix @alyssais @NixOS/stdenv
/lib/derivations.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() await program.parse()

View File

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

View File

@@ -24,13 +24,21 @@ let
default = false; default = false;
}; };
members = lib.mkOption { members = lib.mkOption {
type = types.listOf (types.submodule (import ./maintainer-module.nix { inherit lib; })); type = types.listOf (types.submodule ./maintainer-module.nix);
default = [ ]; default = [ ];
}; };
github = lib.mkOption { github = lib.mkOption {
type = types.str; type = types.str;
default = ""; 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] > [!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. > 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. 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. Once approved, the team will have the right privileges to be pinged and requested for review in Nixpkgs.
> [!TIP] > [!TIP]
> The team name should be as short as possible; because it is nested under the maintainers group, no -maintainers suffix is needed. > 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 # Maintainer scripts
Various utility scripts, which are mainly useful for nixpkgs maintainers, are available under `./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 #!/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. # 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. # 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. # The script uses the credentials from the GitHub CLI (gh)
# This is required to access the GitHub Teams API so the token needs at least the read:org privilege. # This is required to access the GitHub Teams API so it needs at least the read:org privilege.
## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::ProhibitBacktickOperators) ## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::ProhibitBacktickOperators)
use strict; use strict;
@@ -14,39 +14,21 @@ use Carp;
use Cwd 'abs_path'; use Cwd 'abs_path';
use File::Basename; use File::Basename;
use JSON qw(decode_json); use JSON qw(decode_json);
use LWP::UserAgent;
use Term::ReadKey qw(ReadLine ReadMode);
sub github_team_members { sub github_team_members {
my ($team_name, $username, $token) = @_; my ($team_name) = @_;
my @ret; my @ret;
my $req = HTTP::Request->new('GET', "https://api.github.com/orgs/NixOS/teams/$team_name/members", [ 'Accept' => 'application/vnd.github.v3+json' ]); my $content = decode_json(`gh api orgs/NixOS/teams/$team_name/members`);
$req->authorization_basic($username, $token);
my $response = LWP::UserAgent->new->request($req);
if ($response->is_success) {
my $content = decode_json($response->decoded_content);
foreach (@{$content}) { foreach (@{$content}) {
push @ret, $_->{'login'}; push @ret, $_->{'login'};
} }
} else {
print {*STDERR} "!! Requesting members of GitHub Team '$team_name' failed: " . $response->status_line;
}
return \@ret; return \@ret;
} }
# Read GitHub credentials `gh auth status` or die "`gh` comes from `pkgs.github-cli`, or in one command:
print {*STDERR} 'GitHub username: '; nix-shell -p github-cli --run 'gh auth login'\n";
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;
# Read nix output # Read nix output
my $nix_version = `nix --version`; my $nix_version = `nix --version`;
@@ -60,7 +42,6 @@ if ($nix_version =~ m/2[.]3[.]/msx) {
my $data = decode_json($out); my $data = decode_json($out);
# Process teams # Process teams
print {*STDERR} "\n";
while (my ($team_nix_key, $team_config) = each %{$data}) { while (my ($team_nix_key, $team_config) = each %{$data}) {
# Ignore teams that don't want to be or can't be pinged # Ignore teams that don't want to be or can't be pinged
if (not defined $team_config->{enableFeatureFreezePing} or not $team_config->{enableFeatureFreezePing}) { 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; next;
} }
# Team name # Team name
print {*STDERR} "$team_config->{shortName}:"; print {*STDOUT} "$team_config->{shortName}:";
# GitHub Teams # GitHub Teams
my @github_members; my @github_members;
if (defined $team_config->{github}) { if (defined $team_config->{github}) {
print {*STDERR} " \@NixOS/$team_config->{github}"; print {*STDOUT} " \@NixOS/$team_config->{github}";
push @github_members, @{github_team_members($team_config->{github}, $github_user, $github_token)}; push @github_members, @{github_team_members($team_config->{github})};
} }
my %github_members = map { $_ => 1 } @github_members; my %github_members = map { $_ => 1 } @github_members;
# Members # Members
@@ -88,9 +69,11 @@ while (my ($team_nix_key, $team_config) = each %{$data}) {
if (defined $github_members{$github_handle}) { if (defined $github_members{$github_handle}) {
next; 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. List of maintainer teams.
name = { name = {
# Required
members = [ maintainer1 maintainer2 ]; members = [ maintainer1 maintainer2 ];
scope = "Maintain foo packages."; scope = "Maintain foo packages.";
shortName = "foo"; shortName = "foo";
# Optional
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
github = "my-subsystem"; github = "my-subsystem";
}; };
@@ -18,7 +16,12 @@
- `enableFeatureFreezePing` will ping this team during the Feature Freeze announcements on releases - `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 - There is limited mention capacity in a single post, so this should be reserved for critical components
or larger ecosystems within nixpkgs. 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. More fields may be added in the future.
@@ -56,16 +59,7 @@ with lib.maintainers;
}; };
android = { android = {
members = [
adrian-gierakowski
hadilq
johnrtitor
numinit
RossComputerGuy
];
scope = "Maintain Android-related tooling in nixpkgs.";
github = "android"; github = "android";
shortName = "Android";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -106,20 +100,7 @@ with lib.maintainers;
}; };
beam = { beam = {
members = [
adamcstephens
ankhers
Br1ght0ne
DianaOlympos
gleber
happysalada
minijackson
yurrriq
savtrip
];
github = "beam"; github = "beam";
scope = "Maintain BEAM-related packages and modules.";
shortName = "BEAM";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -193,34 +174,11 @@ with lib.maintainers;
}; };
categorization = { categorization = {
members = [
aleksana
fgaz
getpsyched
lyndeno
natsukium
philiptaron
pyrotelekinetic
raskin
sigmasquadron
tomodachi94
];
github = "categorization"; 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 = { ci = {
members = [
MattSturgeon
mic92
philiptaron
wolfgangwalther
zowoq
];
github = "nixpkgs-ci"; github = "nixpkgs-ci";
scope = "Maintain Nixpkgs' in-tree Continuous Integration, including GitHub Actions.";
shortName = "CI";
}; };
cinnamon = { cinnamon = {
@@ -237,7 +195,6 @@ with lib.maintainers;
members = [ floriansanderscc ]; members = [ floriansanderscc ];
scope = "Maintain Clever Cloud related packages."; scope = "Maintain Clever Cloud related packages.";
shortName = "CleverCloud"; shortName = "CleverCloud";
github = "CleverCloud";
}; };
cloudposse = { cloudposse = {
@@ -263,21 +220,7 @@ with lib.maintainers;
}; };
cosmic = { cosmic = {
members = [
a-kenji
ahoneybun
drakon64
griffi-gh
HeitorAugustoLN
nyabinary
pandapip1
qyliss
thefossguy
michaelBelsanti
];
github = "cosmic"; github = "cosmic";
shortName = "cosmic";
scope = "Maintain the COSMIC DE and related packages.";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -291,15 +234,6 @@ with lib.maintainers;
}; };
cuda = { cuda = {
members = [
connorbaker
GaetanLepage
prusnak
samuela
SomeoneSerge
];
scope = "Maintain CUDA-enabled packages";
shortName = "Cuda";
github = "cuda-maintainers"; github = "cuda-maintainers";
}; };
@@ -316,14 +250,7 @@ with lib.maintainers;
}; };
darwin = { darwin = {
members = [
emily
reckenrode
toonn
];
github = "darwin-core"; github = "darwin-core";
scope = "Maintain core platform support and packages for macOS and other Apple platforms.";
shortName = "Darwin";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -367,10 +294,7 @@ with lib.maintainers;
}; };
docs = { docs = {
members = [ ];
github = "documentation-team"; github = "documentation-team";
scope = "Maintain nixpkgs/NixOS documentation and tools for building it.";
shortName = "Docs";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -411,31 +335,11 @@ with lib.maintainers;
}; };
enlightenment = { enlightenment = {
members = [ romildo ];
github = "enlightenment"; 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; enableFeatureFreezePing = true;
}; };
flutter = { flutter = {
members = [
mkg20001
RossComputerGuy
FlafyDev
hacker1024
];
scope = "Maintain Flutter and Dart-related packages and build tools";
shortName = "flutter";
enableFeatureFreezePing = false; enableFeatureFreezePing = false;
github = "flutter"; github = "flutter";
}; };
@@ -496,18 +400,7 @@ with lib.maintainers;
}; };
geospatial = { geospatial = {
members = [
autra
imincik
l0b0
nh2
nialov
sikmir
willcohen
];
github = "geospatial"; github = "geospatial";
scope = "Maintain geospatial, remote sensing and OpenStreetMap software.";
shortName = "Geospatial";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -524,15 +417,7 @@ with lib.maintainers;
}; };
gnome = { gnome = {
members = [
bobby285271
hedning
jtojnar
dasj19
];
github = "gnome"; github = "gnome";
scope = "Maintain GNOME desktop environment and platform.";
shortName = "GNOME";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -547,17 +432,7 @@ with lib.maintainers;
}; };
golang = { golang = {
members = [
kalbasit
katexochen
mic92
zowoq
qbit
mfrw
];
github = "golang"; github = "golang";
scope = "Maintain Golang compilers.";
shortName = "Go";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -573,15 +448,7 @@ with lib.maintainers;
}; };
haskell = { haskell = {
members = [
cdepillabout
maralorn
sternenseemann
wolfgangwalther
];
github = "haskell"; github = "haskell";
scope = "Maintain Haskell packages and infrastructure.";
shortName = "Haskell";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -607,16 +474,7 @@ with lib.maintainers;
}; };
hyprland = { hyprland = {
members = [
donovanglover
fufexan
johnrtitor
khaneliman
NotAShelf
];
github = "hyprland"; github = "hyprland";
scope = "Maintain Hyprland compositor and ecosystem";
shortName = "Hyprland";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -638,14 +496,6 @@ with lib.maintainers;
java = { java = {
github = "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; enableFeatureFreezePing = true;
}; };
@@ -684,17 +534,6 @@ with lib.maintainers;
k3s = { k3s = {
github = "k3s"; github = "k3s";
members = [
euank
frederictobiasc
heywoodlh
marcusramberg
mic92
rorosen
wrmilling
];
scope = "Maintain K3s package, NixOS module, NixOS tests, update script";
shortName = "K3s";
}; };
kodi = { kodi = {
@@ -746,16 +585,7 @@ with lib.maintainers;
}; };
lisp = { lisp = {
members = [
raskin
lukego
nagy
uthar
hraban
];
github = "lisp"; github = "lisp";
scope = "Maintain the Lisp ecosystem.";
shortName = "lisp";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -773,19 +603,7 @@ with lib.maintainers;
}; };
llvm = { llvm = {
members = [
dtzWill
emily
ericson2314
lovek323
qyliss
RossComputerGuy
rrbutani
sternenseemann
];
github = "llvm"; github = "llvm";
scope = "Maintain LLVM package sets and related packages";
shortName = "LLVM";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -797,23 +615,12 @@ with lib.maintainers;
}; };
loongarch64 = { loongarch64 = {
members = [
aleksana
Cryolitia
darkyzhou
dramforever
wegank
];
github = "loongarch64"; github = "loongarch64";
scope = "Maintain LoongArch64 related packages and code";
shortName = "LoongArch64";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
lua = { lua = {
github = "lua"; github = "lua";
scope = "Maintain the lua ecosystem.";
shortName = "lua";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -828,10 +635,7 @@ with lib.maintainers;
}; };
lumina = { lumina = {
members = [ romildo ];
github = "lumina"; github = "lumina";
scope = "Maintain lumina desktop environment and related packages.";
shortName = "Lumina";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -847,23 +651,12 @@ with lib.maintainers;
}; };
lxqt = { lxqt = {
members = [ romildo ];
github = "lxqt"; github = "lxqt";
scope = "Maintain LXQt desktop environment and related packages.";
shortName = "LXQt";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
marketing = { marketing = {
members = [
djacu
flyfloh
thilobillerbeck
tomberek
];
github = "marketing-team"; github = "marketing-team";
scope = "Marketing of Nix/NixOS/nixpkgs.";
shortName = "Marketing";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -927,15 +720,7 @@ with lib.maintainers;
}; };
neovim = { neovim = {
members = [
GaetanLepage
khaneliman
mrcjkb
perchun
];
github = "neovim"; github = "neovim";
scope = "Maintain the vim and neovim text editors and related packages.";
shortName = "Vim/Neovim";
}; };
nextcloud = { nextcloud = {
@@ -993,13 +778,7 @@ with lib.maintainers;
}; };
ocaml = { ocaml = {
members = [
alizter
redianthus
];
github = "ocaml"; github = "ocaml";
scope = "Maintain the OCaml compiler and package set.";
shortName = "OCaml";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -1031,13 +810,7 @@ with lib.maintainers;
}; };
pantheon = { pantheon = {
members = [
davidak
bobby285271
];
github = "pantheon"; github = "pantheon";
scope = "Maintain Pantheon desktop environment and platform.";
shortName = "Pantheon";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -1053,26 +826,12 @@ with lib.maintainers;
}; };
php = { php = {
members = [
aanderse
ma27
piotrkwiecinski
talyz
];
github = "php"; github = "php";
scope = "Maintain PHP related packages and extensions.";
shortName = "PHP";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
podman = { podman = {
members = [
saschagrunert
vdemeester
];
github = "podman"; github = "podman";
scope = "Maintain Podman and CRI-O related packages and modules.";
shortName = "Podman";
}; };
postgres = { postgres = {
@@ -1097,18 +856,7 @@ with lib.maintainers;
}; };
qt-kde = { qt-kde = {
members = [
ilya-fedin
k900
LunNova
mjm
nickcao
SuperSandro2000
ttuegel
];
github = "qt-kde"; github = "qt-kde";
scope = "Maintain the Qt framework, KDE application suite, Plasma desktop environment and related projects.";
shortName = "Qt / KDE";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -1134,43 +882,12 @@ with lib.maintainers;
shortName = "Red Code Labs"; shortName = "Red Code Labs";
}; };
release = {
members = [ ];
github = "nixos-release-managers";
scope = "Manage the current nixpkgs/NixOS release.";
shortName = "Release";
};
rocm = { rocm = {
members = [
Flakebi
GZGavinZhao
LunNova
mschwaig
];
github = "rocm"; 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 = { rust = {
members = [
figsoda
mic92
tjni
winter
zowoq
];
github = "rust"; github = "rust";
scope = "Maintain the Rust compiler toolchain and nixpkgs integration.";
shortName = "Rust";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -1185,16 +902,7 @@ with lib.maintainers;
}; };
sdl = { sdl = {
members = [ github = "sdl";
evythedemon
grimmauld
jansol
marcin-serwin
pbsds
];
github = "SDL";
scope = "Maintain core SDL libraries.";
shortName = "SDL";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -1221,16 +929,6 @@ with lib.maintainers;
}; };
stdenv = { stdenv = {
members = [
artturin
emily
ericson2314
philiptaron
reckenrode
RossComputerGuy
];
scope = "Maintain the standard environment and its surrounding logic.";
shortName = "stdenv";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
github = "stdenv"; github = "stdenv";
}; };
@@ -1267,16 +965,7 @@ with lib.maintainers;
}; };
systemd = { systemd = {
members = [
flokli
arianvp
elvishjerricco
aanderse
grimmauld
];
github = "systemd"; github = "systemd";
scope = "Maintain systemd for NixOS.";
shortName = "systemd";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
}; };
@@ -1326,14 +1015,6 @@ with lib.maintainers;
}; };
xen = { xen = {
members = [
hehongbo
lach
sigmasquadron
rane
];
scope = "Maintain the Xen Project Hypervisor and the related tooling ecosystem.";
shortName = "Xen Project Hypervisor";
enableFeatureFreezePing = true; enableFeatureFreezePing = true;
github = "xen-project"; github = "xen-project";
}; };