| #!/usr/bin/env python3 | |
| import argparse | |
| import getdeveloperlib | |
| import sys | |
| def __main__(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('patches', metavar='P', type=argparse.FileType('r'), nargs='*', | |
| help='list of patches (use - to read patches from stdin)') | |
| parser.add_argument('-a', dest='architecture', action='store', | |
| help='find developers in charge of this architecture') | |
| parser.add_argument('-p', dest='package', action='store', | |
| help='find developers in charge of this package') | |
| parser.add_argument('-f', dest='files', nargs='*', | |
| help='find developers in charge of these files') | |
| parser.add_argument('-c', dest='check', action='store_const', | |
| const=True, help='list files not handled by any developer') | |
| parser.add_argument('--cc', action="store_true", | |
| help='list affected developers as CC: lines ready to be pasted in a commit log') | |
| parser.add_argument('-e', dest='email', action='store_const', | |
| const=True, help='only list affected developer email addresses') | |
| parser.add_argument('-v', dest='validate', action='store_const', | |
| const=True, help='validate syntax of DEVELOPERS file') | |
| parser.add_argument('-d', dest='filename', action='store', default=None, | |
| help='override the default DEVELOPERS file (for debug)') | |
| args = parser.parse_args() | |
| # Check that only one action is given | |
| action = 0 | |
| if args.architecture is not None: | |
| action += 1 | |
| if args.package is not None: | |
| action += 1 | |
| if args.files: | |
| action += 1 | |
| if args.check: | |
| action += 1 | |
| if args.validate: | |
| action += 1 | |
| if len(args.patches) != 0: | |
| action += 1 | |
| if action > 1: | |
| parser.error("Cannot do more than one action") | |
| if action == 0: | |
| if sys.stdin.isatty(): | |
| parser.error("No action specified") | |
| args.patches.append(sys.stdin) | |
| devs = getdeveloperlib.parse_developers(args.filename) | |
| if devs is None: | |
| sys.exit(1) | |
| # Validation is done by parse_developers() above and we error out | |
| # if the validation didn't work, so if we reach here, it means | |
| # validation passed, so we can simply bail out in success. | |
| if args.validate: | |
| return | |
| # Handle the check action | |
| if args.check: | |
| files = getdeveloperlib.check_developers(devs) | |
| for f in files: | |
| print(f) | |
| # Handle the architecture action | |
| if args.architecture is not None: | |
| for dev in devs: | |
| if args.architecture in dev.architectures: | |
| print(dev.name) | |
| return | |
| # Handle the package action | |
| if args.package is not None: | |
| for dev in devs: | |
| if args.package in dev.packages: | |
| print(dev.name) | |
| return | |
| # Handle the files action | |
| if args.files is not None: | |
| for dev in devs: | |
| for f in args.files: | |
| if dev.hasfile(f): | |
| print(dev.name) | |
| break | |
| # Handle the patches action | |
| if len(args.patches) != 0: | |
| (files, infras) = getdeveloperlib.analyze_patches(args.patches) | |
| matching_devs = set() | |
| for dev in devs: | |
| # See if we have developers matching by package name | |
| for f in files: | |
| if dev.hasfile(f): | |
| matching_devs.add(dev.name) | |
| # See if we have developers matching by package infra | |
| for i in infras: | |
| if i in dev.infras: | |
| matching_devs.add(dev.name) | |
| matching_devs = sorted(matching_devs) | |
| if args.email or args.cc: | |
| for dev in matching_devs: | |
| print(f"{'Cc: ' if args.cc else ''}{dev}") | |
| else: | |
| result = "--to buildroot@buildroot.org" | |
| for dev in matching_devs: | |
| result += " --cc \"%s\"" % dev | |
| if result != "": | |
| print("git send-email %s" % result) | |
| __main__() |