Files
scylladb/scripts/find-maintainer
Pekka Enberg da06339b13 scripts/find-maintainer: Find subsystem maintainer
This patch adds a scripts/find-maintainer script, similar to
script/get_maintainer.pl in Linux, which looks up maintainers and
reviewers for a specific file from a MAINTAINERS file.

Example usage looks as follows:

$ ./scripts/find-maintainer cql3/statements/create_view_statement.cc
CQL QUERY LANGUAGE
  Tomasz Grabiec <tgrabiec@scylladb.com>   [maintainer]
  Pekka Enberg <penberg@scylladb.com>      [maintainer]
MATERIALIZED VIEWS
  Duarte Nunes <duarte@scylladb.com>       [maintainer]
  Pekka Enberg <penberg@scylladb.com>      [maintainer]
  Nadav Har'El <nyh@scylladb.com>          [reviewer]
  Duarte Nunes <duarte@scylladb.com>       [reviewer]

The main objective of this script is to make it easier for people to
find reviewers and maintainers for their patches.
Message-Id: <20180119075556.31441-1-penberg@scylladb.com>
2018-01-30 09:42:35 +00:00

89 lines
2.5 KiB
Python
Executable File

#!/usr/bin/python3
import argparse
import fnmatch
class Subsystem:
def __init__(self, name):
self.name = name
self.maintainers = []
self.reviewers = []
self.patterns = []
def add_maintainer(self, email):
self.maintainers += [email]
def add_reviewer(self, email):
self.reviewers += [email]
def add_pattern(self, pattern):
self.patterns += [pattern]
def match(self, target):
for pattern in self.patterns:
if fnmatch.fnmatch(target, pattern):
return True
return False
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"filename", help="filename to find a maintainer or reviewer for")
args = parser.parse_args()
subsystems = []
with open('MAINTAINERS') as f:
lines = f.readlines()
# Find starting point of subsystems:
while len(lines) > 0:
line = lines.pop(0).strip()
if line == "---":
break
# Parse subsystems:
while len(lines) > 0:
subsystem_name = lines.pop(0).strip()
if len(subsystem_name) == 0:
continue
subsystem = Subsystem(subsystem_name)
if subsystem_name == "THE REST":
the_rest = subsystem
else:
subsystems += [subsystem]
while len(lines) > 0:
annotation = lines.pop(0).strip()
if len(annotation) == 0:
break
key, value = annotation.split(": ")
if key == 'M':
subsystem.add_maintainer(value)
elif key == 'R':
subsystem.add_reviewer(value)
elif key == 'F':
subsystem.add_pattern(value)
match = False
for subsystem in subsystems:
if subsystem.match(args.filename):
match = True
print(subsystem.name)
for maintainer in subsystem.maintainers:
print(" %-40s [maintainer]" % maintainer)
for reviewer in subsystem.reviewers:
print(" %-40s [reviewer]" % reviewer)
if not match:
print("No subsystem found for file '%s'. Contact one of the following maintainers:" % args.filename)
for maintainer in the_rest.maintainers:
print(" %s" % maintainer)
for reviewer in the_rest.reviewers:
print(" %s" % reviewer)