mirror of
https://github.com/NixOS/rfcs.git
synced 2025-12-02 15:11:10 +01:00
[RFC-0055] Retire inactive nixpkgs committers (#55)
This commit is contained in:
parent
3c113d3025
commit
7c5ee3478d
1 changed files with 153 additions and 0 deletions
153
rfcs/0055-retired-committers.md
Normal file
153
rfcs/0055-retired-committers.md
Normal file
|
|
@ -0,0 +1,153 @@
|
||||||
|
---
|
||||||
|
feature: retired-committers
|
||||||
|
start-date: 2019-08-25
|
||||||
|
author: Till Höppner
|
||||||
|
co-authors: Graham Christensen
|
||||||
|
shepherd-team: (names, to be nominated and accepted by RFC steering committee)
|
||||||
|
shepherd-leader: (name to be appointed by RFC steering committee)
|
||||||
|
related-issues: (will contain links to implementation PRs)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
[summary]: #summary
|
||||||
|
|
||||||
|
Many people were given push access to the nixpkgs repository, which is kept even if
|
||||||
|
these committers become inactive. This RFC proposes moving these contributors to
|
||||||
|
a new team without push access.
|
||||||
|
|
||||||
|
# Motivation
|
||||||
|
[motivation]: #motivation
|
||||||
|
|
||||||
|
<!-- Why are we doing this? What use cases does it support? What is the expected
|
||||||
|
outcome? -->
|
||||||
|
|
||||||
|
Each committer represents secrets and access which need to be managed carefully.
|
||||||
|
These come in the form of passwords, SSH and GPG keys, and leaking them can put nixpkgs
|
||||||
|
at risk of of unauthorized modification.
|
||||||
|
|
||||||
|
Because every secret with push access can be leaked, we should keep their number as low as necessary,
|
||||||
|
here by deactivating the push access of inactive committers.
|
||||||
|
A special case of inactive committers are those who have lost access to their GitHub account entirely,
|
||||||
|
who would be unable to remove potentially leaked secrets from their account.
|
||||||
|
|
||||||
|
As of 2019-08-18, at least 2 committers have officially stepped down, and at least 1 committer has
|
||||||
|
not pushed to nixpkgs since 2014, but are still able to push directly to nixpkgs.
|
||||||
|
|
||||||
|
If implemented in this form, and assuming no further contributions, 7 contributors will be moved at the beginning of 2020.
|
||||||
|
|
||||||
|
|
||||||
|
# Detailed design
|
||||||
|
[design]: #detailed-design
|
||||||
|
|
||||||
|
<!-- This is the bulk of the RFC. Explain the design in enough detail for somebody
|
||||||
|
familiar with the ecosystem to understand, and implement. This should get
|
||||||
|
into specifics and corner-cases, and include examples of how the feature is
|
||||||
|
used. -->
|
||||||
|
|
||||||
|
Inactive committers will have their push access disabled after not committing to nixpkgs for an entire year.
|
||||||
|
|
||||||
|
That year is measured from January 1 to December 31 instead of using a rolling window over the last 12 months,
|
||||||
|
to be more predictable for committers and reduce the evaluations from 12 times a year to just once a year.
|
||||||
|
|
||||||
|
For each committer from the [Nixpkgs Committers team](https://github.com/orgs/NixOS/teams/nixpkgs-committers), the number of commits
|
||||||
|
in that time range is checked, and the committer is considered inactive if there are none.
|
||||||
|
|
||||||
|
Previous committers are moved to a new Nixpkgs Committers Emeritus team, to honor their past contributions.
|
||||||
|
Members of this team will remain in the GitHub organisation, and may regain push access at a later time.
|
||||||
|
|
||||||
|
The process consists of the following steps:
|
||||||
|
|
||||||
|
- Running the [reference implementation][implementation] or a functionally equivalent application.
|
||||||
|
- Checking the correctness of the script output by manually inspecting the recent git history of inactive committers.
|
||||||
|
This may be done by reviewing the activity page linked in the script output of the reference implementation.
|
||||||
|
- Notification of the confirmed inactive committers, via a GitHub issue and an email to the committers address,
|
||||||
|
according to `<nixpkgs/maintainers/maintainer-list.nix>`. The text should include a notice on how to regain
|
||||||
|
commit permissions. The exact process of that is not part of this RFC, as the process of becoming a committer
|
||||||
|
in the first place is still not formalised.
|
||||||
|
- Moving of the confirmed inactive committers from the [Nixpkgs Committers team](https://github.com/orgs/NixOS/teams/nixpkgs-committers) team
|
||||||
|
to the new Nixpkgs Committers Emeritus team, either directly if sufficient permissions are available,
|
||||||
|
or indirectly by notifying an organisation administrator.
|
||||||
|
|
||||||
|
This process occurs once after the RFC is accepted, and is then repeated at the beginning of each new year.
|
||||||
|
|
||||||
|
@Mic92 has committed to performing the yearly process, but any member of the NixOS organisation can execute the above
|
||||||
|
steps if @Mic92 does not remember to do so in a reasonable amount of time after the beginning of the year.
|
||||||
|
|
||||||
|
|
||||||
|
# Drawbacks
|
||||||
|
[drawbacks]: #drawbacks
|
||||||
|
|
||||||
|
<!-- Why should we *not* do this? -->
|
||||||
|
|
||||||
|
- It might put pressure on people because they might lose their hard-earned permissions.
|
||||||
|
- Lower activity limits might encourage quota contributions of lower quality with the intention of not losing push access.
|
||||||
|
|
||||||
|
# Alternatives
|
||||||
|
[alternatives]: #alternatives
|
||||||
|
|
||||||
|
<!-- What other designs have been considered? What is the impact of not doing this? -->
|
||||||
|
|
||||||
|
- Committers could keep push access forever.
|
||||||
|
- We could be even stricter, at the risk of higher contributor churn and losing low-frequency direct contributions.
|
||||||
|
|
||||||
|
# Unresolved questions
|
||||||
|
[unresolved]: #unresolved-questions
|
||||||
|
|
||||||
|
<!-- What parts of the design are still TBD or unknowns? -->
|
||||||
|
|
||||||
|
- Is one year without commits a good activity threshold?
|
||||||
|
- How are committers informed about this change, or an impending revocation?
|
||||||
|
|
||||||
|
# Future work
|
||||||
|
[future]: #future-work
|
||||||
|
|
||||||
|
<!-- What future work, if any, would be implied or impacted by this feature
|
||||||
|
without being directly part of the work? -->
|
||||||
|
|
||||||
|
- The threshold may need adjustment in the future.
|
||||||
|
|
||||||
|
# Reference implementation
|
||||||
|
[implementation]: #reference-implementation
|
||||||
|
|
||||||
|
```py
|
||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -I nixpkgs=https://github.com/nixos/nixpkgs-channels/archive/1412af4b2cfae71d447164097d960d426e9752c0.tar.gz -i python3 -p "python3.withPackages (p: [ p.PyGithub ])"
|
||||||
|
|
||||||
|
# nixpkgs-inactive-committers expects an API token passed in the environment as GITHUB_TOKEN
|
||||||
|
# Such a token can be created at https://github.com/settings/tokens
|
||||||
|
# Make sure to enable the read:org scope
|
||||||
|
|
||||||
|
from sys import stderr
|
||||||
|
from github import Github
|
||||||
|
from datetime import date, time, datetime
|
||||||
|
import os
|
||||||
|
|
||||||
|
year = date.today().year - 1
|
||||||
|
start_of_year = datetime.combine(date(year, 1, 1), time.min)
|
||||||
|
|
||||||
|
print(f'Reporting from {start_of_year}')
|
||||||
|
|
||||||
|
gh = Github(os.environ['GITHUB_TOKEN'],
|
||||||
|
user_agent='nixpkgs-inactive-committers',
|
||||||
|
per_page=100, timeout=90, retry=5)
|
||||||
|
print(gh.get_rate_limit(), file=stderr)
|
||||||
|
|
||||||
|
org = gh.get_organization('nixos')
|
||||||
|
nixpkgs = org.get_repo('nixpkgs')
|
||||||
|
committers = org.get_team_by_slug('nixpkgs-committers').get_members()
|
||||||
|
sorted_committers = sorted(list(committers), key=lambda c: c.login.lower())
|
||||||
|
|
||||||
|
def hasCommit(commits):
|
||||||
|
# totalCount is borked, len(list(...)) eats too many API calls
|
||||||
|
try:
|
||||||
|
c = commits[0]
|
||||||
|
return True
|
||||||
|
except IndexError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
for member in sorted_committers:
|
||||||
|
commits = nixpkgs.get_commits(author=member, since=start_of_year)
|
||||||
|
|
||||||
|
if not hasCommit(commits):
|
||||||
|
print(f'{member.login:<20} https://github.com/NixOS/nixpkgs/commits?author={member.login}')
|
||||||
|
```
|
||||||
Loading…
Add table
Add a link
Reference in a new issue