1*4882a593Smuzhiyun#!/usr/bin/env python3 2*4882a593Smuzhiyun 3*4882a593Smuzhiyunimport argparse 4*4882a593Smuzhiyunimport getdeveloperlib 5*4882a593Smuzhiyunimport sys 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun 8*4882a593Smuzhiyundef parse_args(): 9*4882a593Smuzhiyun parser = argparse.ArgumentParser() 10*4882a593Smuzhiyun parser.add_argument('patches', metavar='P', type=argparse.FileType('r'), nargs='*', 11*4882a593Smuzhiyun help='list of patches (use - to read patches from stdin)') 12*4882a593Smuzhiyun parser.add_argument('-a', dest='architecture', action='store', 13*4882a593Smuzhiyun help='find developers in charge of this architecture') 14*4882a593Smuzhiyun parser.add_argument('-p', dest='package', action='store', 15*4882a593Smuzhiyun help='find developers in charge of this package') 16*4882a593Smuzhiyun parser.add_argument('-f', dest='files', nargs='*', 17*4882a593Smuzhiyun help='find developers in charge of these files') 18*4882a593Smuzhiyun parser.add_argument('-c', dest='check', action='store_const', 19*4882a593Smuzhiyun const=True, help='list files not handled by any developer') 20*4882a593Smuzhiyun parser.add_argument('-e', dest='email', action='store_const', 21*4882a593Smuzhiyun const=True, help='only list affected developer email addresses') 22*4882a593Smuzhiyun return parser.parse_args() 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun 25*4882a593Smuzhiyundef __main__(): 26*4882a593Smuzhiyun args = parse_args() 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun # Check that only one action is given 29*4882a593Smuzhiyun action = 0 30*4882a593Smuzhiyun if args.architecture is not None: 31*4882a593Smuzhiyun action += 1 32*4882a593Smuzhiyun if args.package is not None: 33*4882a593Smuzhiyun action += 1 34*4882a593Smuzhiyun if args.files: 35*4882a593Smuzhiyun action += 1 36*4882a593Smuzhiyun if args.check: 37*4882a593Smuzhiyun action += 1 38*4882a593Smuzhiyun if len(args.patches) != 0: 39*4882a593Smuzhiyun action += 1 40*4882a593Smuzhiyun if action > 1: 41*4882a593Smuzhiyun print("Cannot do more than one action") 42*4882a593Smuzhiyun return 43*4882a593Smuzhiyun if action == 0: 44*4882a593Smuzhiyun print("No action specified") 45*4882a593Smuzhiyun return 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun devs = getdeveloperlib.parse_developers() 48*4882a593Smuzhiyun if devs is None: 49*4882a593Smuzhiyun sys.exit(1) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun # Handle the check action 52*4882a593Smuzhiyun if args.check: 53*4882a593Smuzhiyun files = getdeveloperlib.check_developers(devs) 54*4882a593Smuzhiyun for f in files: 55*4882a593Smuzhiyun print(f) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun # Handle the architecture action 58*4882a593Smuzhiyun if args.architecture is not None: 59*4882a593Smuzhiyun for dev in devs: 60*4882a593Smuzhiyun if args.architecture in dev.architectures: 61*4882a593Smuzhiyun print(dev.name) 62*4882a593Smuzhiyun return 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun # Handle the package action 65*4882a593Smuzhiyun if args.package is not None: 66*4882a593Smuzhiyun for dev in devs: 67*4882a593Smuzhiyun if args.package in dev.packages: 68*4882a593Smuzhiyun print(dev.name) 69*4882a593Smuzhiyun return 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun # Handle the files action 72*4882a593Smuzhiyun if args.files is not None: 73*4882a593Smuzhiyun for dev in devs: 74*4882a593Smuzhiyun for f in args.files: 75*4882a593Smuzhiyun if dev.hasfile(f): 76*4882a593Smuzhiyun print(dev.name) 77*4882a593Smuzhiyun break 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun # Handle the patches action 80*4882a593Smuzhiyun if len(args.patches) != 0: 81*4882a593Smuzhiyun (files, infras) = getdeveloperlib.analyze_patches(args.patches) 82*4882a593Smuzhiyun matching_devs = set() 83*4882a593Smuzhiyun for dev in devs: 84*4882a593Smuzhiyun # See if we have developers matching by package name 85*4882a593Smuzhiyun for f in files: 86*4882a593Smuzhiyun if dev.hasfile(f): 87*4882a593Smuzhiyun matching_devs.add(dev.name) 88*4882a593Smuzhiyun # See if we have developers matching by package infra 89*4882a593Smuzhiyun for i in infras: 90*4882a593Smuzhiyun if i in dev.infras: 91*4882a593Smuzhiyun matching_devs.add(dev.name) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun if args.email: 94*4882a593Smuzhiyun for dev in matching_devs: 95*4882a593Smuzhiyun print(dev) 96*4882a593Smuzhiyun else: 97*4882a593Smuzhiyun result = "--to buildroot@buildroot.org" 98*4882a593Smuzhiyun for dev in matching_devs: 99*4882a593Smuzhiyun result += " --cc \"%s\"" % dev 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun if result != "": 102*4882a593Smuzhiyun print("git send-email %s" % result) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun__main__() 106