diff --git a/contrib/check-MAINTAINERS.py b/contrib/check-MAINTAINERS.py new file mode 100755 index 0000000000000000000000000000000000000000..ca7bb29128252c238ae03ade32f9b7cdefdc833b --- /dev/null +++ b/contrib/check-MAINTAINERS.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2022 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GCC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# Check that names in the file are sorted +# alphabetically by surname. + +import locale +import sys +from difflib import ndiff +from itertools import dropwhile, takewhile + +import unidecode + +locale.setlocale(locale.LC_ALL, 'en_US.utf8') + +exit_code = 0 + +if len(sys.argv) != 2: + print('Usage: ./check-MAINTAINERS.py path-to/MAINTAINERS') + sys.exit(1) + + +def sort_by_surname(line): + name = line.split('\t')[0] + parts = name.split() + surname = parts[-1] + + # Special-case some names + if name == 'Stefan Schulze Frielinghaus': + surname = parts[1] + elif name == 'Kris Van Hees': + surname = parts[1] + elif surname == "d'Humieres": + surname = 'Humieres' + + # Remove accents + return (unidecode.unidecode(surname), line) + + +def has_tab(line): + return '\t' in line + + +def is_empty(line): + return line + + +def check_group(name, lines): + global exit_code + + for line in lines: + if line.startswith(' '): + print(f'Line should not start with space: "{line}"') + exit_code = 2 + + lines = [line + '\n' for line in lines] + sorted_lines = sorted(lines, key=sort_by_surname) + if lines != sorted_lines: + exit_code = 1 + diff = ndiff(lines, sorted_lines) + print(f'Wrong order for {name}:\n') + print(''.join(diff)) + else: + print(f'{name} are fine!') + + +lines = open('MAINTAINERS').read().splitlines() + +needle = 'Global Reviewers' +lines = list(dropwhile(lambda x: x.strip() != needle, lines)) +lines = lines[2:] + +chunk = list(takewhile(is_empty, lines)) +check_group(needle, chunk) + +needle = 'Write After Approval' +lines = list(dropwhile(lambda x: needle not in x, lines)) +lines = lines[2:] + +chunk = list(takewhile(is_empty, lines)) +check_group(needle, chunk) + +needle = 'Bug database only accounts' +lines = list(dropwhile(lambda x: needle not in x, lines)) +lines = lines[2:] + +chunk = list(takewhile(is_empty, lines)) +check_group(needle, chunk) + +needle = 'Contributing under the DCO' +lines = list(dropwhile(lambda x: needle not in x, lines))[1:] +lines = list(dropwhile(lambda x: not has_tab(x), lines)) +check_group(needle, lines) + +sys.exit(exit_code)