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

login
register
mail settings
Submitter Marek Vasut
Date March 5, 2012, 9:11 p.m.
Message ID <1330981868-29895-1-git-send-email-marex@denx.de>
Download mbox | patch
Permalink /patch/144771/
State Changes Requested
Headers show

Comments

Marek Vasut - March 5, 2012, 9:11 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 |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 112 insertions(+), 3 deletions(-)

V2: Add -M option to lost all emails, let -m list only emails from MAINTAINERS.
    Fix issues found by wdenk (thanks!)
V3: Fix issue when asking for maintainer of a non-existing board.
Wolfgang Denk - March 5, 2012, 9:30 p.m.
Dear Marek Vasut,

In message <1330981868-29895-1-git-send-email-marex@denx.de> you wrote:
> 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 |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 112 insertions(+), 3 deletions(-)
> 
> V2: Add -M option to lost all emails, let -m list only emails from MAINTAINERS.
>     Fix issues found by wdenk (thanks!)
> V3: Fix issue when asking for maintainer of a non-existing board.

Note: the "V3" hint is missing in Subject:

There are still issues:

-> ./MAKEALL -m lwmon
lwmon:tail: cannot open `1099' for reading: No such file or directory



-> ./MAKEALL -m
...
galaxy5200:emillbrandt@dekaresearch.com
galaxy5200_LOWBOOT:emillbrandt@dekaresearch.com
icecube_5200:tail: +: invalid number of lines

icecube_5200_DDR:tail: +: invalid number of lines

icecube_5200_DDR_LOWBOOT:tail: +: invalid number of lines

icecube_5200_DDR_LOWBOOT08:tail: +: invalid number of lines

icecube_5200_LOWBOOT:tail: +: invalid number of lines

icecube_5200_LOWBOOT08:tail: +: invalid number of lines

inka4x0:dzu@denx.de
ipek01:wg@denx.de
jupiter:hs@denx.de
Lite5200:tail: +: invalid number of lines

lite5200b:tail: +: invalid number of lines

lite5200b_LOWBOOT:tail: +: invalid number of lines

lite5200b_PM:tail: +: invalid number of lines

Lite5200_LOWBOOT:tail: +: invalid number of lines

Lite5200_LOWBOOT08:tail: +: invalid number of lines

mcc200:
...



Thanks for this great tool!

Best regards,

Wolfgang Denk
Mike Frysinger - March 5, 2012, 11:08 p.m.
On Monday 05 March 2012 16:11:08 Marek Vasut wrote:
> +get_target_location() {
> +	target=$1
> +
> +	BOARD_NAME=""
> +	CONFIG_NAME=""
> +	board=""
> +	vendor=""

please use "local" when declaring variables that are function local

> +	line=`egrep -i "^[[:space:]]*${target}[[:space:]]" boards.cfg`

obviously i prefer $(...) rather than `...`

> +	if [ -z "${line}" ] ; then echo "" ; return ; fi

please unroll

> +	[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"

	: ${BOARD_NAME:=${1%_config}}

> +	[ $# -gt 6 ] && [ "$7" != "-" ] && {

please use:
	if ... ; then

> +	if ! grep -i ${name} MAINTAINERS >/dev/null 2>&1 ; then

use -qs and then you can drop the redirects

> +		return ;

drop the semi-colon
-mike

Patch

diff --git a/MAKEALL b/MAKEALL
index 0f2b4a1..b9a8176 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,107 @@  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`
+
+	if [ -z "${line}" ] ; then echo "" ; return ; fi
+
+	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`
+
+	if [ -z "${loc}" ] ; then echo "ERROR" ; return ; fi
+
+	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