Patchwork [U-Boot,V2] MAKEALL: Add -m/-M option to determine maintainers

login
register
mail settings
Submitter Marek Vasut
Date March 5, 2012, 8:35 p.m.
Message ID <1330979701-26414-1-git-send-email-marex@denx.de>
Download mbox | patch
Permalink /patch/144764/
State Superseded
Headers show

Comments

Marek Vasut - March 5, 2012, 8:35 p.m.
The -m option tries to find the board in MAINTAINERS file and figure out the
email. The -M option lists boards including their maintainers emails and all
affiliated emails. There are multiple strategies used to retrieve these emails:

1) Check board/<boardname> with git log and use three most recent emails
2) Check board/<boardname> with git log and use three most used emails
3) Try finding board in MAINTAINERS file and retrieve all emails from there

The result is then sorted and unique results are retrieved and reported.

For -m option, only strategy 3) is used.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Wolfgang Denk <wd@denx.de>
---
 MAKEALL |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 106 insertions(+), 3 deletions(-)

V2: Add -M option to lost all emails, let -m list only emails from MAINTAINERS.
    Fix issues found by wdenk (thanks!)
Marek Vasut - March 5, 2012, 8:38 p.m.
> The -m option tries to find the board in MAINTAINERS file and figure out
> the email. The -M option lists boards including their maintainers emails
> and all affiliated emails. There are multiple strategies used to retrieve
> these emails:

Ignore this one please.

Best regards,
Marek Vasut

Patch

diff --git a/MAKEALL b/MAKEALL
index 0f2b4a1..0a1a768 100755
--- a/MAKEALL
+++ b/MAKEALL
@@ -17,6 +17,8 @@  usage()
 	  -v VENDOR, --vendor VENDOR   Build all boards with vendor VENDOR
 	  -s SOC,    --soc SOC         Build all boards with soc SOC
 	  -l,        --list            List all targets to be built
+	  -m,        --maintainers     List all targets and maintainer email
+	  -M,        --mails           List all targets and all affilated emails
 	  -h,        --help            This help output
 
 	Selections by these options are logically ANDed; if the same option
@@ -48,8 +50,8 @@  usage()
 	exit ${ret}
 }
 
-SHORT_OPTS="ha:c:v:s:l"
-LONG_OPTS="help,arch:,cpu:,vendor:,soc:,list"
+SHORT_OPTS="ha:c:v:s:lmM"
+LONG_OPTS="help,arch:,cpu:,vendor:,soc:,list,maintainers,mails"
 
 # Option processing based on util-linux-2.13/getopt-parse.bash
 
@@ -67,6 +69,8 @@  eval set -- "$TEMP"
 
 SELECTED=''
 ONLY_LIST=''
+PRINT_MAINTS=''
+MAINTAINERS_ONLY=''
 
 while true ; do
 	case "$1" in
@@ -109,6 +113,15 @@  while true ; do
 	-l|--list)
 		ONLY_LIST='y'
 		shift ;;
+	-m|--maintainers)
+		ONLY_LIST='y'
+		PRINT_MAINTS='y'
+		MAINTAINERS_ONLY='y'
+		shift ;;
+	-M|--mails)
+		ONLY_LIST='y'
+		PRINT_MAINTS='y'
+		shift ;;
 	-h|--help)
 		usage ;;
 	--)
@@ -483,11 +496,101 @@  LIST_nds32="$(boards_by_arch nds32)"
 
 #-----------------------------------------------------------------------
 
+get_target_location() {
+	target=$1
+
+	BOARD_NAME=""
+	CONFIG_NAME=""
+	board=""
+	vendor=""
+
+	# Automatic mode
+	line=`egrep -i "^[[:space:]]*${target}[[:space:]]" boards.cfg`
+	set ${line}
+
+	# add default board name if needed
+	[ $# = 3 ] && set ${line} ${1}
+
+	CONFIG_NAME="${1%_config}"
+
+	[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"
+
+	if [ "$4" = "-" ] ; then
+		board=${BOARD_NAME}
+	else
+		board="$4"
+	fi
+
+	[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"
+	[ $# -gt 6 ] && [ "$7" != "-" ] && {
+		tmp="${7%:*}"
+		if [ "$tmp" ] ; then
+			CONFIG_NAME="$tmp"
+		fi
+	}
+
+	# Assign board directory to BOARDIR variable
+	if [ -z "${vendor}" ] ; then
+	    BOARDDIR=${board}
+	else
+	    BOARDDIR=${vendor}/${board}
+	fi
+
+	echo "${CONFIG_NAME}:${BOARDDIR}"
+}
+
+get_target_maintainers() {
+	name=`echo $1 | cut -d : -f 1`
+
+	if ! grep -i ${name} MAINTAINERS >/dev/null 2>&1 ; then
+		echo ""
+		return ;
+	fi
+
+	line=`tac MAINTAINERS | grep -ni "[[:blank:]]${name}[[:blank:]]" | cut -d : -f 1`
+	mail=`tac MAINTAINERS | tail -n +${line} | \
+		sed -n ":start /.*@.*/ { b mail } ; n ; b start ; :mail /.*@.*/ { p ; n ; b mail } ; q" | \
+		sed "s/^.*<//;s/>.*$//"`
+	echo "$mail"
+}
+
+list_target() {
+	if [ "$PRINT_MAINTS" != 'y' ] ; then
+		echo "$1"
+		return
+	fi
+
+	echo -n "$1:"
+
+	loc=`get_target_location $1`
+	maintainers_result=`get_target_maintainers ${loc} | tr " " "\n"`
+
+	if [ "$MAINTAINERS_ONLY" != 'y' ] ; then
+
+		dir=`echo ${loc} | cut -d ":" -f 2`
+		cfg=`echo ${loc} | cut -d ":" -f 1`
+		git_result=`git log --format=%aE board/${dir} \
+				include/configs/${cfg}.h | grep "@"`
+		git_result_recent=`echo ${git_result} | tr " " "\n" | head -n 3`
+		git_result_top=`echo ${git_result} | tr " " "\n" | \
+			sort | uniq -c | sort -nr | head -n 3 | \
+			sed "s/^ \+[0-9]\+ \+//"`
+
+		echo -e "$git_result_recent\n$git_result_top\n$maintainers_result" | \
+			sort -u | tr "\n" " " | sed "s/ $//" ;
+	else
+		echo -e "$maintainers_result" | sort -u | tr "\n" " " | \
+						sed "s/ $//" ;
+	fi
+
+	echo ""
+}
+
 build_target() {
 	target=$1
 
 	if [ "$ONLY_LIST" == 'y' ] ; then
-		echo "$target"
+		list_target ${target}
 		return
 	fi