dpdk/devtools/check-maintainers.sh
<<
>>
Prefs
   1#! /bin/sh
   2# SPDX-License-Identifier: BSD-3-Clause
   3# Copyright 2015 6WIND S.A.
   4
   5# Do some basic checks in MAINTAINERS file
   6
   7cd $(dirname $0)/..
   8
   9# speed up by ignoring Unicode details
  10export LC_ALL=C
  11
  12# Get files matching paths with wildcards and / meaning recursing
  13files () # <path> [<path> ...]
  14{
  15        if [ -z "$1" ] ; then
  16                return
  17        fi
  18        if [ -r .git ] ; then
  19                git ls-files "$1"
  20        else
  21                find $1 -type f |
  22                sed 's,^\./,,'
  23        fi |
  24        # if not ended by /
  25        if ! echo "$1" | grep -q '/[[:space:]]*$' ; then
  26                # filter out deeper directories
  27                sed "/\(\/[^/]*\)\{$(($(echo "$1" | grep -o / | wc -l) + 1))\}/d"
  28        else
  29                cat
  30        fi
  31        # next path
  32        shift
  33        files "$@"
  34}
  35
  36# Get all files matching F: and X: fields
  37parse_fx () # <index file>
  38{
  39        IFS='
  40'
  41        # parse each line excepted underlining
  42        for line in $( (sed '/^-\+$/d' $1 ; echo) | sed 's,^$,§,') ; do
  43                if echo "$line" | grep -q '^§$' ; then
  44                        # empty line delimit end of section
  45                        include_files=$(files $flines)
  46                        exclude_files=$(files $xlines)
  47                        match=$(aminusb "$include_files" "$exclude_files")
  48                        if [ -n "$include_files" ] ; then
  49                                printf "# $title "
  50                                maintainers=$(echo "$maintainers" | sed -r 's,.*<(.*)>.*,\1,')
  51                                maintainers=$(printf "$maintainers" | sed -e 's,^,<,' -e 's,$,>,')
  52                                echo $maintainers
  53                        fi
  54                        if [ -n "$match" ] ; then
  55                                echo "$match"
  56                        fi
  57                        # flush section
  58                        unset maintainers
  59                        unset flines
  60                        unset xlines
  61                elif echo "$line" | grep -q '^[A-Z]: ' ; then
  62                        # maintainer
  63                        maintainers=$(add_line_to_if "$line" "$maintainers" 'M: ')
  64                        # file matching pattern
  65                        flines=$(add_line_to_if "$line" "$flines" 'F: ')
  66                        # file exclusion pattern
  67                        xlines=$(add_line_to_if "$line" "$xlines" 'X: ')
  68                else # assume it is a title
  69                        title="$line"
  70                fi
  71        done
  72}
  73
  74# Check patterns in F: and X:
  75check_fx () # <index file>
  76{
  77        IFS='
  78'
  79        for line in $(sed -n 's,^[FX]: ,,p' $1 | tr '*' '#') ; do
  80                line=$(printf "$line" | tr '#' '*')
  81                match=$(files "$line")
  82                if [ -z "$match" ] ; then
  83                        echo "$line"
  84                fi
  85        done
  86}
  87
  88# Add a line to a set of lines if it begins with right pattern
  89add_line_to_if () # <new line> <lines> <head pattern>
  90{
  91        (
  92                echo "$2"
  93                echo "$1" | sed -rn "s,^$3(.*),\1,p"
  94        ) |
  95        sed '/^$/d'
  96}
  97
  98# Subtract two sets of lines
  99aminusb () # <lines a> <lines b>
 100{
 101        printf "$1\n$2\n$2" | sort | uniq -u | sed '/^$/d'
 102}
 103
 104printf 'sections: '
 105parsed=$(parse_fx MAINTAINERS)
 106echo "$parsed" | grep -c '^#'
 107printf 'with maintainer: '
 108echo "$parsed" | grep -c '^#.*@'
 109printf 'maintainers: '
 110grep '^M:.*<' MAINTAINERS | sort -u | wc -l
 111
 112echo
 113echo '##########'
 114echo '# orphan areas'
 115echo '##########'
 116echo "$parsed" | sed -rn 's,^#([^@]*)$,\1,p' | uniq
 117
 118echo
 119echo '##########'
 120echo '# files not listed'
 121echo '##########'
 122all=$(files ./)
 123listed=$(echo "$parsed" | sed '/^#/d' | sort -u)
 124aminusb "$all" "$listed"
 125
 126echo
 127echo '##########'
 128echo '# wrong patterns'
 129echo '##########'
 130check_fx MAINTAINERS
 131
 132# TODO: check overlaps
 133