diff --git a/members/Defelo b/members/Defelo index e69de29..c55a5c9 100644 --- a/members/Defelo +++ b/members/Defelo @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/Enzime b/members/Enzime index e69de29..3fb16d6 100644 --- a/members/Enzime +++ b/members/Enzime @@ -0,0 +1 @@ +2025-08-20 diff --git a/members/FliegendeWurst b/members/FliegendeWurst index e69de29..d4b68c1 100644 --- a/members/FliegendeWurst +++ b/members/FliegendeWurst @@ -0,0 +1 @@ +2024-12-06 diff --git a/members/LordGrimmauld b/members/LordGrimmauld index e69de29..3fb16d6 100644 --- a/members/LordGrimmauld +++ b/members/LordGrimmauld @@ -0,0 +1 @@ +2025-08-20 diff --git a/members/MattSturgeon b/members/MattSturgeon index e69de29..3fb16d6 100644 --- a/members/MattSturgeon +++ b/members/MattSturgeon @@ -0,0 +1 @@ +2025-08-20 diff --git a/members/MatthewCroughan b/members/MatthewCroughan index e69de29..eda1c4b 100644 --- a/members/MatthewCroughan +++ b/members/MatthewCroughan @@ -0,0 +1 @@ +2024-10-07 diff --git a/members/NetaliDev b/members/NetaliDev index e69de29..b02d5ca 100644 --- a/members/NetaliDev +++ b/members/NetaliDev @@ -0,0 +1 @@ +2024-11-06 diff --git a/members/Scrumplex b/members/Scrumplex index e69de29..0798812 100644 --- a/members/Scrumplex +++ b/members/Scrumplex @@ -0,0 +1 @@ +2024-10-20 diff --git a/members/ShamrockLee b/members/ShamrockLee index e69de29..e319b44 100644 --- a/members/ShamrockLee +++ b/members/ShamrockLee @@ -0,0 +1 @@ +2024-12-01 diff --git a/members/SigmaSquadron b/members/SigmaSquadron index e69de29..3fb16d6 100644 --- a/members/SigmaSquadron +++ b/members/SigmaSquadron @@ -0,0 +1 @@ +2025-08-20 diff --git a/members/Sigmanificient b/members/Sigmanificient index e69de29..c55a5c9 100644 --- a/members/Sigmanificient +++ b/members/Sigmanificient @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/TomaSajt b/members/TomaSajt index e69de29..b02d5ca 100644 --- a/members/TomaSajt +++ b/members/TomaSajt @@ -0,0 +1 @@ +2024-11-06 diff --git a/members/afh b/members/afh index e69de29..c55a5c9 100644 --- a/members/afh +++ b/members/afh @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/alexfmpe b/members/alexfmpe index e69de29..b02d5ca 100644 --- a/members/alexfmpe +++ b/members/alexfmpe @@ -0,0 +1 @@ +2024-11-06 diff --git a/members/anthonyroussel b/members/anthonyroussel index e69de29..eda1c4b 100644 --- a/members/anthonyroussel +++ b/members/anthonyroussel @@ -0,0 +1 @@ +2024-10-07 diff --git a/members/artemist b/members/artemist index e69de29..b383a64 100644 --- a/members/artemist +++ b/members/artemist @@ -0,0 +1 @@ +2025-01-20 diff --git a/members/baloo b/members/baloo index e69de29..b02d5ca 100644 --- a/members/baloo +++ b/members/baloo @@ -0,0 +1 @@ +2024-11-06 diff --git a/members/getchoo b/members/getchoo index e69de29..e319b44 100644 --- a/members/getchoo +++ b/members/getchoo @@ -0,0 +1 @@ +2024-12-01 diff --git a/members/hsjobeki b/members/hsjobeki index e69de29..b383a64 100644 --- a/members/hsjobeki +++ b/members/hsjobeki @@ -0,0 +1 @@ +2025-01-20 diff --git a/members/isabelroses b/members/isabelroses index e69de29..c55a5c9 100644 --- a/members/isabelroses +++ b/members/isabelroses @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/jmbaur b/members/jmbaur index e69de29..3fb16d6 100644 --- a/members/jmbaur +++ b/members/jmbaur @@ -0,0 +1 @@ +2025-08-20 diff --git a/members/khaneliman b/members/khaneliman index e69de29..b02d5ca 100644 --- a/members/khaneliman +++ b/members/khaneliman @@ -0,0 +1 @@ +2024-11-06 diff --git a/members/m1cr0man b/members/m1cr0man index e69de29..3fb16d6 100644 --- a/members/m1cr0man +++ b/members/m1cr0man @@ -0,0 +1 @@ +2025-08-20 diff --git a/members/matteo-pacini b/members/matteo-pacini index e69de29..c55a5c9 100644 --- a/members/matteo-pacini +++ b/members/matteo-pacini @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/misuzu b/members/misuzu index e69de29..e319b44 100644 --- a/members/misuzu +++ b/members/misuzu @@ -0,0 +1 @@ +2024-12-01 diff --git a/members/msanft b/members/msanft index e69de29..b383a64 100644 --- a/members/msanft +++ b/members/msanft @@ -0,0 +1 @@ +2025-01-20 diff --git a/members/niklaskorz b/members/niklaskorz index e69de29..c55a5c9 100644 --- a/members/niklaskorz +++ b/members/niklaskorz @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/numinit b/members/numinit index e69de29..c55a5c9 100644 --- a/members/numinit +++ b/members/numinit @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/phaer b/members/phaer index e69de29..c55a5c9 100644 --- a/members/phaer +++ b/members/phaer @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/pyrox0 b/members/pyrox0 index e69de29..b383a64 100644 --- a/members/pyrox0 +++ b/members/pyrox0 @@ -0,0 +1 @@ +2025-01-20 diff --git a/members/r-vdp b/members/r-vdp index e69de29..eda1c4b 100644 --- a/members/r-vdp +++ b/members/r-vdp @@ -0,0 +1 @@ +2024-10-07 diff --git a/members/rhelmot b/members/rhelmot index e69de29..b383a64 100644 --- a/members/rhelmot +++ b/members/rhelmot @@ -0,0 +1 @@ +2025-01-20 diff --git a/members/stepbrobd b/members/stepbrobd index e69de29..c55a5c9 100644 --- a/members/stepbrobd +++ b/members/stepbrobd @@ -0,0 +1 @@ +2025-04-22 diff --git a/members/tomodachi94 b/members/tomodachi94 index e69de29..eda1c4b 100644 --- a/members/tomodachi94 +++ b/members/tomodachi94 @@ -0,0 +1 @@ +2024-10-07 diff --git a/members/uninsane b/members/uninsane index e69de29..b02d5ca 100644 --- a/members/uninsane +++ b/members/uninsane @@ -0,0 +1 @@ +2024-11-06 diff --git a/members/wolfgangwalther b/members/wolfgangwalther index e69de29..e319b44 100644 --- a/members/wolfgangwalther +++ b/members/wolfgangwalther @@ -0,0 +1 @@ +2024-12-01 diff --git a/members/xanderio b/members/xanderio index e69de29..e319b44 100644 --- a/members/xanderio +++ b/members/xanderio @@ -0,0 +1 @@ +2024-12-01 diff --git a/scripts/README.md b/scripts/README.md index 78e7179..5c0e41f 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -25,6 +25,11 @@ Once you have the above setup (or got @infinisil to add yourself to his), you ha To cover all code branches it's recommended to create, push to and delete a branch. You can do this from the web interface. - Get the GitHub CLI available (`pkgs.github-cli`) and authenticate it using `gh auth login` +- A local Git clone of this repository with the `origin` remote set to the test repository: + ```bash + git remote add upstream git@github.com:NixOS/nixpkgs-committers.git + git remote set-url origin git@github.com:infinisil-test-org/nixpkgs-committers.git + ``` ## Testing `sync.sh` @@ -42,17 +47,18 @@ This script has external effects and as such needs a bit more care when testing. ### Setup (important!) -To avoid other users getting pings, ensure that the `members` directory contains only your own user, then commit and push it for testing: +To avoid other users getting pings, ensure that the `members` directory contains only a simulated new user and your own user (simulated to have been added over a year ago), then commit and push it for testing: ```bash me=$(gh api /user --jq .login) -git switch -c "test-$me" +git switch -C "test-$me" rm -rf members mkdir members -touch "members/$me" +date +%F > "members/github" +date --date="1 year ago 1 day ago" +%F > "members/$me" git add members git commit -m testing -git push -u git@github.com:infinisil-test-org/nixpkgs-committers HEAD +git push -f -u origin HEAD ``` ### Test sequence @@ -71,7 +77,7 @@ The following sequence tests all code paths: scripts/retire.sh infinisil-test-org empty nixpkgs-committers members 'yesterday 1 month ago' ``` - Check that it would create a PR before running it again with `PROD=1` to actually do it: + Check that it would only create a PR for your own user and not the "github" user before running it again with `PROD=1` to actually do it: ```bash PROD=1 scripts/retire.sh infinisil-test-org empty nixpkgs-committers members 'yesterday 1 month ago' diff --git a/scripts/retire.sh b/scripts/retire.sh index fb367a6..bffd73a 100755 --- a/scripts/retire.sh +++ b/scripts/retire.sh @@ -26,7 +26,7 @@ effect() { } usage() { - log "Usage: $0 ORG ACTIVITY_REPO MEMBER_REPO DIR PR_CUTOFF_DATE" + log "Usage: $0 ORG ACTIVITY_REPO MEMBER_REPO DIR NOTICE_CUTOFF" exit 1 } @@ -34,10 +34,11 @@ ORG=${1:-$(usage)} ACTIVITY_REPO=${2:-$(usage)} MEMBER_REPO=${3:-$(usage)} DIR=${4:-$(usage)} -CUTOFF_DATE=${5:-$(usage)} +NOTICE_CUTOFF=${5:-$(usage)} mainBranch=$(git branch --show-current) -cutoffEpoch=$(date --date="$CUTOFF_DATE" +%s) +newCutoff=$(date --date="1 year ago" +%s) +noticeCutoff=$(date --date="$NOTICE_CUTOFF" +%s) if [[ -z "${PROD:-}" ]]; then tmp=$(git rev-parse --show-toplevel)/.tmp @@ -52,6 +53,15 @@ fi mkdir -p "$DIR" cd "$DIR" for login in *; do + + # Don't remove people that have been added recently + if [[ -s "$login" ]]; then + epochAdded=$(date --date="$(<"$login")" +%s) + if (( newCutoff < epochAdded )); then + continue + fi + fi + trace gh api -X GET /repos/"$ORG"/"$ACTIVITY_REPO"/activity \ -f time_period=year \ -f actor="$login" \ @@ -75,7 +85,7 @@ for login in *; do # If there is a PR already prNumber=$(jq .number <<< "$prInfo") epochCreatedAt=$(date --date="$(jq -r .created_at <<< "$prInfo")" +%s) - if jq -e .draft <<< "$prInfo" >/dev/null && (( epochCreatedAt < cutoffEpoch )); then + if jq -e .draft <<< "$prInfo" >/dev/null && (( epochCreatedAt < noticeCutoff )); then log "$login has a retirement PR due, unmarking PR as draft and commenting with next steps" effect gh pr ready --repo "$ORG/$MEMBER_REPO" "$prNumber" { diff --git a/scripts/sync.sh b/scripts/sync.sh index 3422acc..15b2271 100755 --- a/scripts/sync.sh +++ b/scripts/sync.sh @@ -10,16 +10,17 @@ ORG=${1:-$(usage)} TEAM=${2:-$(usage)} DIR=${3:-$(usage)} -shopt -s nullglob - -mkdir -p "$DIR" -cd "$DIR" - -for login in *; do - rm "$login" -done +mkdir -p "$DIR.new" gh api /orgs/"$ORG"/teams/"$TEAM"/members --paginate --jq '.[].login' | while read -r login; do - touch "$login" + if [[ -f "$DIR/$login" ]]; then + mv "$DIR/$login" "$DIR.new" + else + # Keep track of when the user was added + date +%F > "$DIR.new/$login" + fi done + +rm -rf "$DIR" +mv "$DIR.new" "$DIR"