git: 38505d89582f - main - Tools/scripts: add a script to suggest work for port developers.

From: Rene Ladan <rene_at_FreeBSD.org>
Date: Sat, 16 Aug 2025 13:06:04 UTC
The branch main has been updated by rene:

URL: https://cgit.FreeBSD.org/ports/commit/?id=38505d89582f404bd1330b8db9da7506005b28b6

commit 38505d89582f404bd1330b8db9da7506005b28b6
Author:     Rene Ladan <rene@FreeBSD.org>
AuthorDate: 2025-08-16 13:04:25 +0000
Commit:     Rene Ladan <rene@FreeBSD.org>
CommitDate: 2025-08-16 13:05:46 +0000

    Tools/scripts: add a script to suggest work for port developers.
---
 Tools/scripts/find-work-for-installed-ports.sh | 64 ++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)

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