summaryrefslogtreecommitdiff
path: root/util/scripts/find_new_user_commits.sh
diff options
context:
space:
mode:
authorMartin Roth <gaumless@gmail.com>2023-09-27 12:06:01 -0600
committerMartin L Roth <gaumless@gmail.com>2023-10-16 18:53:26 +0000
commitdb02f11c04ab65ab5714f94aa9f6d4057b2d9694 (patch)
tree3414591cc1afd51e7b570f3662d49bdc7397617f /util/scripts/find_new_user_commits.sh
parent8da57ba0e7f356d3b599190ff5423cf6eed01c64 (diff)
util/scripts: Add a script to find new users' commits on gerrit
This script lists all new commits from users with few merged commits. By default, it looks at the last week, and considers anyone with fewer than 5 commits merged to be a new user. Currently the only command line argument that's accepted is the gerrit username of the person running the query. To modify any of the other options, the values hard-coded into the script need to be updated. To keep down the number of repeated queries, the script saves lists of users considered to be experienced, as well as the commits from new users that it lists. Signed-off-by: Martin Roth <gaumless@gmail.com> Change-Id: Ic698798f3fddc77900c8c4e6f8427991bda3f2d1 Reviewed-on: https://review.coreboot.org/c/coreboot/+/78184 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nicholas Chin <nic.c3.14@gmail.com>
Diffstat (limited to 'util/scripts/find_new_user_commits.sh')
-rwxr-xr-xutil/scripts/find_new_user_commits.sh120
1 files changed, 120 insertions, 0 deletions
diff --git a/util/scripts/find_new_user_commits.sh b/util/scripts/find_new_user_commits.sh
new file mode 100755
index 0000000000..32d79cc488
--- /dev/null
+++ b/util/scripts/find_new_user_commits.sh
@@ -0,0 +1,120 @@
+#!/usr/bin/env bash
+# shellcheck disable=SC2310,SC2312
+# The above line must be directly after the shebang line.
+# Disables these warnings:
+# SC2310 - This function is invoked in an 'if' condition so set -e will be disabled.
+# Invoke separately if failures should cause the script to exit.
+# SC2312 - Consider invoking this command separately to avoid masking its return value
+
+#
+# SPDX-License-Identifier: GPL-2.0-only
+#
+
+#
+# Description:
+# Identifies new users in gerrit so that they can be greeted and marked
+# as new users.
+#
+
+VERSION="1.00"
+PROGRAM=$0
+PROGNAME="$(basename "${PROGRAM}")"
+
+COMMIT_COUNT=5 # Consider a user to be new until they have this many commits
+AGE="1week"
+#AGE="3months"
+KNOWN_AUTHOR_FILE="./authorlist.txt"
+NEW_AUTHOR_FILE="./new_authors.txt"
+GERRIT_USER="$1"
+GERRIT_REPO="review.coreboot.org"
+
+show_version() {
+ echo "${PROGNAME} version ${VERSION}"
+ echo
+}
+
+usage() {
+ echo "Usage: ${PROGNAME} <gerrit username>"
+ echo "example: ${PROGNAME} martinlroth"
+}
+
+main() {
+ local commit_count
+ local patchlist
+ local owner
+ local owner_email
+ local commit_id
+ local new_users=0
+
+ show_version
+
+ if ! jq --version >/dev/null 2>&1; then
+ echo "Error: jq is not installed. Please install it with your package manager."
+ exit 1
+ fi
+
+ if [[ -z ${GERRIT_USER} ]]; then
+ echo "Error: Please specify gerrit username on the command line." >&2
+ fi
+ if [[ -z ${GERRIT_USER} || ${GERRIT_USER} == "--help" || ${GERRIT_USER} == "-h" ]]; then
+ usage
+ exit 1
+ fi
+
+ echo "List of known users with more than 5 commits: ${KNOWN_AUTHOR_FILE}"
+ echo "List of new user's patches: ${NEW_AUTHOR_FILE}"
+ echo "Key: . = author in known user list or new user commit already seen"
+ echo " : = author getting added to known user list"
+ echo
+
+ touch "${NEW_AUTHOR_FILE}" "${KNOWN_AUTHOR_FILE}"
+
+ # Get all coreboot patches that aren't by known users, newer than the age set above
+ patchlist="$(ssh -p 29418 "${GERRIT_USER}@${GERRIT_REPO}" gerrit query --format=JSON --no-limit --current-patch-set "repo:coreboot AND status:open NOT age:${AGE} NOT ownerin:Reviewers NOT ownerin:\\\"Core Developers\\\"" |
+ jq -Mr '.currentPatchSet.uploader.name + ", " + .currentPatchSet.uploader.email + ", " + .currentPatchSet.revision + ", " + (.number | tostring)' |
+ grep -v "null\|^,");"
+
+ if [[ -z ${patchlist} ]]; then
+ echo "Error: No patches returned." >&2
+ exit 1
+ else
+ echo "$(wc -l <<<"${patchlist}") patches found."
+ fi
+
+ # Loop through all patches found, looking for any that are not by a known author.
+ # If an author with more than 5 patches is found, add them to a list to filter out in the future.
+ # If we find a new patch, print it, then add it to a list so that it isn't reported again.
+ IFS=$'\n'
+ for patch in ${patchlist}; do
+ owner="$(echo "${patch}" | cut -f1 -d',')"
+ owner_email="$(echo "${patch}" | cut -f2 -d',')"
+ commit_id="$(echo "${patch}" | cut -f4 -d',')"
+
+ if grep -qi "${owner}" "${KNOWN_AUTHOR_FILE}" || grep -qi "${owner_email}" "${KNOWN_AUTHOR_FILE}" || grep -q "${commit_id}" "${NEW_AUTHOR_FILE}"; then
+ printf "."
+ continue
+ fi
+
+ # Get the author's commit count
+ # shellcheck disable=SC2126 # (Consider using grep -c instead of grep | wc)
+ commit_count="$(ssh -p 29418 "${GERRIT_USER}@${GERRIT_REPO}" gerrit query --format=JSON "limit:6 AND repo:coreboot AND owner:${owner_email} and status:merged" |
+ jq -Mr '.owner.name + ", " + .owner.email' |
+ grep -v "null\|^," |
+ wc -l)"
+ if [[ ${commit_count} -ge ${COMMIT_COUNT} ]]; then
+ printf ":"
+ echo "${owner}, ${owner_email}" >>"${KNOWN_AUTHOR_FILE}"
+ continue
+ fi
+
+ printf "\n%s looks to be a patch by a new author.\n" "${patch}"
+ echo "${patch}" >>"${NEW_AUTHOR_FILE}"
+ new_users+=1
+ done
+ printf "\n"
+ if [[ ${new_users} -eq 0 ]]; then
+ echo "No new patches by new users found."
+ fi
+}
+
+main