mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-06-13 05:05:29 +03:00
ci/request-reviews: split off a more reusable reviewer processing script
We can reuse the new process-reviewers.json part for requesting reviews from maintainers.
This commit is contained in:
parent
0dd7250c73
commit
0371b7fb4b
4 changed files with 64 additions and 37 deletions
|
@ -15,6 +15,7 @@ stdenvNoCC.mkDerivation {
|
||||||
root = ./.;
|
root = ./.;
|
||||||
fileset = lib.fileset.unions [
|
fileset = lib.fileset.unions [
|
||||||
./get-reviewers.sh
|
./get-reviewers.sh
|
||||||
|
./process-reviewers.sh
|
||||||
./request-reviews.sh
|
./request-reviews.sh
|
||||||
./verify-base-branch.sh
|
./verify-base-branch.sh
|
||||||
./dev-branches.txt
|
./dev-branches.txt
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Get the code owners of the files changed by a PR,
|
# Get the code owners of the files changed by a PR, returning one username per line
|
||||||
# suitable to be consumed by the API endpoint to request reviews:
|
|
||||||
# https://docs.github.com/en/rest/pulls/review-requests?apiVersion=2022-11-28#request-reviewers-for-a-pull-request
|
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
@ -10,18 +8,15 @@ log() {
|
||||||
echo "$@" >&2
|
echo "$@" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
if (( "$#" < 7 )); then
|
if (( "$#" < 4 )); then
|
||||||
log "Usage: $0 GIT_REPO OWNERS_FILE BASE_REPO BASE_REF HEAD_REF PR_NUMBER PR_AUTHOR"
|
log "Usage: $0 GIT_REPO OWNERS_FILE BASE_REF HEAD_REF"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
gitRepo=$1
|
gitRepo=$1
|
||||||
ownersFile=$2
|
ownersFile=$2
|
||||||
baseRepo=$3
|
baseRef=$3
|
||||||
baseRef=$4
|
headRef=$4
|
||||||
headRef=$5
|
|
||||||
prNumber=$6
|
|
||||||
prAuthor=$7
|
|
||||||
|
|
||||||
tmp=$(mktemp -d)
|
tmp=$(mktemp -d)
|
||||||
trap 'rm -rf "$tmp"' exit
|
trap 'rm -rf "$tmp"' exit
|
||||||
|
@ -98,29 +93,4 @@ for file in "${touchedFiles[@]}"; do
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# Cannot request a review from the author
|
printf "%s\n" "${!users[@]}"
|
||||||
if [[ -v users[${prAuthor,,}] ]]; then
|
|
||||||
log "One or more files are owned by the PR author, ignoring"
|
|
||||||
unset 'users[${prAuthor,,}]'
|
|
||||||
fi
|
|
||||||
|
|
||||||
gh api \
|
|
||||||
-H "Accept: application/vnd.github+json" \
|
|
||||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
|
||||||
"/repos/$baseRepo/pulls/$prNumber/reviews" \
|
|
||||||
--jq '.[].user.login' > "$tmp/already-reviewed-by"
|
|
||||||
|
|
||||||
# And we don't want to rerequest reviews from people who already reviewed
|
|
||||||
while read -r user; do
|
|
||||||
if [[ -v users[${user,,}] ]]; then
|
|
||||||
log "User $user is a code owner but has already left a review, ignoring"
|
|
||||||
unset 'users[${user,,}]'
|
|
||||||
fi
|
|
||||||
done < "$tmp/already-reviewed-by"
|
|
||||||
|
|
||||||
# Turn it into a JSON for the GitHub API call to request PR reviewers
|
|
||||||
jq -n \
|
|
||||||
--arg users "${!users[*]}" \
|
|
||||||
'{
|
|
||||||
reviewers: $users | split(" "),
|
|
||||||
}'
|
|
||||||
|
|
55
ci/request-reviews/process-reviewers.sh
Executable file
55
ci/request-reviews/process-reviewers.sh
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Process reviewers for a PR, reading line-separated usernames on stdin,
|
||||||
|
# returning a JSON suitable to be consumed by the API endpoint to request reviews:
|
||||||
|
# https://docs.github.com/en/rest/pulls/review-requests?apiVersion=2022-11-28#request-reviewers-for-a-pull-request
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "$@" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( "$#" < 3 )); then
|
||||||
|
log "Usage: $0 BASE_REPO PR_NUMBER PR_AUTHOR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
baseRepo=$1
|
||||||
|
prNumber=$2
|
||||||
|
prAuthor=$3
|
||||||
|
|
||||||
|
tmp=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$tmp"' exit
|
||||||
|
|
||||||
|
declare -A users=()
|
||||||
|
while read -r handle && [[ -n "$handle" ]]; do
|
||||||
|
users[$handle]=
|
||||||
|
done
|
||||||
|
|
||||||
|
# Cannot request a review from the author
|
||||||
|
if [[ -v users[${prAuthor,,}] ]]; then
|
||||||
|
log "One or more files are owned by the PR author, ignoring"
|
||||||
|
unset 'users[${prAuthor,,}]'
|
||||||
|
fi
|
||||||
|
|
||||||
|
gh api \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||||
|
"/repos/$baseRepo/pulls/$prNumber/reviews" \
|
||||||
|
--jq '.[].user.login' > "$tmp/already-reviewed-by"
|
||||||
|
|
||||||
|
# And we don't want to rerequest reviews from people who already reviewed
|
||||||
|
while read -r user; do
|
||||||
|
if [[ -v users[${user,,}] ]]; then
|
||||||
|
log "User $user is a code owner but has already left a review, ignoring"
|
||||||
|
unset 'users[${user,,}]'
|
||||||
|
fi
|
||||||
|
done < "$tmp/already-reviewed-by"
|
||||||
|
|
||||||
|
# Turn it into a JSON for the GitHub API call to request PR reviewers
|
||||||
|
jq -n \
|
||||||
|
--arg users "${!users[*]}" \
|
||||||
|
'{
|
||||||
|
reviewers: $users | split(" "),
|
||||||
|
}'
|
|
@ -78,7 +78,8 @@ if ! "$SCRIPT_DIR"/verify-base-branch.sh "$tmp/nixpkgs.git" "$headRef" "$baseRep
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Getting code owners to request reviews from"
|
log "Getting code owners to request reviews from"
|
||||||
"$SCRIPT_DIR"/get-reviewers.sh "$tmp/nixpkgs.git" "$ownersFile" "$baseRepo" "$baseBranch" "$headRef" "$prNumber" "$prAuthor" > "$tmp/reviewers.json"
|
"$SCRIPT_DIR"/get-reviewers.sh "$tmp/nixpkgs.git" "$ownersFile" "$baseBranch" "$headRef" | \
|
||||||
|
"$SCRIPT_DIR"/process-reviewers.sh "$baseRepo" "$prNumber" "$prAuthor" > "$tmp/reviewers.json"
|
||||||
|
|
||||||
log "Requesting reviews from: $(<"$tmp/reviewers.json")"
|
log "Requesting reviews from: $(<"$tmp/reviewers.json")"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue