summaryrefslogtreecommitdiff
path: root/Tools/scripts/find-work-for-installed-ports.sh
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/scripts/find-work-for-installed-ports.sh')
-rwxr-xr-xTools/scripts/find-work-for-installed-ports.sh64
1 files changed, 64 insertions, 0 deletions
diff --git a/Tools/scripts/find-work-for-installed-ports.sh b/Tools/scripts/find-work-for-installed-ports.sh
new file mode 100755
index 000000000000..e9ad442aca88
--- /dev/null
+++ b/Tools/scripts/find-work-for-installed-ports.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+# Tool to find work (such as unassigned Bugzilla PRs) to port committers or
+# perhaps other developers based on the list of locally installed ports.
+# More sources can be added later (such as GitHub pull requests).
+#
+# SPDX-License-Identifier: BSD-2-Clause
+# Copyright (c) 2025 René Ladan <rene@FreeBSD.org>
+# MAINTAINER=rene@FreeBSD.org
+
+set -eu
+
+# Look for PRs in Bugzilla having $1 in the summary line (as opposed to the full
+# PR content), and add each such PR to the output (PR number, assignee, summary)
+# if it is not assigned some FreeBSD.org, with the exception of
+# ports-bugs@FreeBSD.org. The matching is case-insensitive.
+get_PRs()
+{
+ catport=${1}
+ category="$(echo "${catport}" | cut -f 1 -d /)"
+ port="$(echo "${catport}" | cut -f 2 -d /)"
+ timeout=20 # seconds
+
+ echo "getting Bugzilla PRs having ${catport} in the synopsis" >&2
+ # content= looks for the search string in all of the pr content,
+ # summary= only looks in the summary line
+ url="https://bugs.freebsd.org/bugzilla/rest/bug?bug_status=__open__&product=Ports%20%26%20Packages&summary=${category}%2f${port}"
+ raw="$(fetch -q -T ${timeout} -o - "${url}")"
+ # Enable the next line to get full JSON output in per-port files for debugging
+ # echo "${raw}" > "${category}-${port}.json"
+ if [ -z "${raw}" ] ; then
+ echo "${catport}: no REST reply within ${timeout} seconds from URL: ${url}" >&2
+ exit 67
+ fi
+ pr_list="$(echo "${raw}" | jq '[.bugs | map(select(.assigned_to | test("ports-bugs@freebsd.org";"i") or test("@freebsd.org";"i") == false)).[] | {id,assigned_to,summary}]')"
+
+ # The below code is just to get one line per PR in the output.
+ num_prs=$(echo "${pr_list}" | jq length)
+ if [ ${num_prs} -gt 0 ] ; then
+ for i in $(jot ${num_prs} 0) ; do
+ echo "${pr_list}" | jq -r --argjson i ${i} '[.[$i].id,.[$i].assigned_to,.[$i].summary] | @tsv'
+ done
+ fi
+}
+
+if ! which jq >/dev/null ; then
+ echo "Please install textproc/jq" >&2
+ exit 66
+fi
+
+# Iterate through all installed ports which are not maintained by a FreeBSD.org
+# address (this includes ports-bugs and possibly you), and for each such port
+# see if there is output from get_PR() and if so, report it grouped by the port
+# maintainer.
+for p in $(pkg query -e '%m !~ *@FreeBSD.org' %o,%m) ; do
+ origin=$(echo "${p}" | cut -f 1 -d ,)
+ maintainer=$(echo "${p}" | cut -f 2 -d ,)
+
+ # see if there is a Bugzilla report for ${origin}
+ bz="$(get_PRs "${origin}")"
+ if [ -n "${bz}" ] ; then
+ printf "** %s\n%s\n" "${maintainer}" "${bz}"
+ fi
+done