1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/env python 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker""" 4*9880d681SAndroid Build Coastguard Workerwciia - Whose Code Is It Anyway 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard WorkerDetermines code owner of the file/folder relative to the llvm source root. 7*9880d681SAndroid Build Coastguard WorkerCode owner is determined from the content of the CODE_OWNERS.TXT 8*9880d681SAndroid Build Coastguard Workerby parsing the D: field 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerusage: 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerutils/wciia.py path 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerlimitations: 15*9880d681SAndroid Build Coastguard Worker- must be run from llvm source root 16*9880d681SAndroid Build Coastguard Worker- very simplistic algorithm 17*9880d681SAndroid Build Coastguard Worker- only handles * as a wildcard 18*9880d681SAndroid Build Coastguard Worker- not very user friendly 19*9880d681SAndroid Build Coastguard Worker- does not handle the proposed F: field 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker""" 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerimport os 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workercode_owners = {} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdef process_files_and_folders(owner): 28*9880d681SAndroid Build Coastguard Worker filesfolders = owner['filesfolders'] 29*9880d681SAndroid Build Coastguard Worker # paths must be in ( ... ) so strip them 30*9880d681SAndroid Build Coastguard Worker lpar = filesfolders.find('(') 31*9880d681SAndroid Build Coastguard Worker rpar = filesfolders.rfind(')') 32*9880d681SAndroid Build Coastguard Worker if rpar <= lpar: 33*9880d681SAndroid Build Coastguard Worker # give up 34*9880d681SAndroid Build Coastguard Worker return 35*9880d681SAndroid Build Coastguard Worker paths = filesfolders[lpar+1:rpar] 36*9880d681SAndroid Build Coastguard Worker # split paths 37*9880d681SAndroid Build Coastguard Worker owner['paths'] = [] 38*9880d681SAndroid Build Coastguard Worker for path in paths.split(): 39*9880d681SAndroid Build Coastguard Worker owner['paths'].append(path) 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdef process_code_owner(owner): 42*9880d681SAndroid Build Coastguard Worker if 'filesfolders' in owner: 43*9880d681SAndroid Build Coastguard Worker filesfolders = owner['filesfolders'] 44*9880d681SAndroid Build Coastguard Worker else: 45*9880d681SAndroid Build Coastguard Worker# print "F: field missing, using D: field" 46*9880d681SAndroid Build Coastguard Worker owner['filesfolders'] = owner['description'] 47*9880d681SAndroid Build Coastguard Worker process_files_and_folders(owner) 48*9880d681SAndroid Build Coastguard Worker code_owners[owner['name']] = owner 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker# process CODE_OWNERS.TXT first 51*9880d681SAndroid Build Coastguard Workercode_owners_file = open("CODE_OWNERS.TXT", "r").readlines() 52*9880d681SAndroid Build Coastguard Workercode_owner = {} 53*9880d681SAndroid Build Coastguard Workerfor line in code_owners_file: 54*9880d681SAndroid Build Coastguard Worker for word in line.split(): 55*9880d681SAndroid Build Coastguard Worker if word == "N:": 56*9880d681SAndroid Build Coastguard Worker name = line[2:].strip() 57*9880d681SAndroid Build Coastguard Worker if code_owner: 58*9880d681SAndroid Build Coastguard Worker process_code_owner(code_owner) 59*9880d681SAndroid Build Coastguard Worker code_owner = {} 60*9880d681SAndroid Build Coastguard Worker # reset the values 61*9880d681SAndroid Build Coastguard Worker code_owner['name'] = name 62*9880d681SAndroid Build Coastguard Worker if word == "E:": 63*9880d681SAndroid Build Coastguard Worker email = line[2:].strip() 64*9880d681SAndroid Build Coastguard Worker code_owner['email'] = email 65*9880d681SAndroid Build Coastguard Worker if word == "D:": 66*9880d681SAndroid Build Coastguard Worker description = line[2:].strip() 67*9880d681SAndroid Build Coastguard Worker code_owner['description'] = description 68*9880d681SAndroid Build Coastguard Worker if word == "F:": 69*9880d681SAndroid Build Coastguard Worker filesfolders = line[2:].strip() 70*9880d681SAndroid Build Coastguard Worker code_owner['filesfolders'].append(filesfolders) 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdef find_owners(fpath): 73*9880d681SAndroid Build Coastguard Worker onames = [] 74*9880d681SAndroid Build Coastguard Worker lmatch = -1 75*9880d681SAndroid Build Coastguard Worker # very simplistic way of findning the best match 76*9880d681SAndroid Build Coastguard Worker for name in code_owners: 77*9880d681SAndroid Build Coastguard Worker owner = code_owners[name] 78*9880d681SAndroid Build Coastguard Worker if 'paths' in owner: 79*9880d681SAndroid Build Coastguard Worker for path in owner['paths']: 80*9880d681SAndroid Build Coastguard Worker# print "searching (" + path + ")" 81*9880d681SAndroid Build Coastguard Worker # try exact match 82*9880d681SAndroid Build Coastguard Worker if fpath == path: 83*9880d681SAndroid Build Coastguard Worker return name 84*9880d681SAndroid Build Coastguard Worker # see if path ends with a * 85*9880d681SAndroid Build Coastguard Worker rstar = path.rfind('*') 86*9880d681SAndroid Build Coastguard Worker if rstar>0: 87*9880d681SAndroid Build Coastguard Worker # try the longest match, 88*9880d681SAndroid Build Coastguard Worker rpos = -1 89*9880d681SAndroid Build Coastguard Worker if len(fpath) < len(path): 90*9880d681SAndroid Build Coastguard Worker rpos = path.find(fpath) 91*9880d681SAndroid Build Coastguard Worker if rpos == 0: 92*9880d681SAndroid Build Coastguard Worker onames.append(name) 93*9880d681SAndroid Build Coastguard Worker onames.append('Chris Lattner') 94*9880d681SAndroid Build Coastguard Worker return onames 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker# now lest try to find the owner of the file or folder 97*9880d681SAndroid Build Coastguard Workerimport sys 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerif len(sys.argv) < 2: 100*9880d681SAndroid Build Coastguard Worker print "usage " + sys.argv[0] + " file_or_folder" 101*9880d681SAndroid Build Coastguard Worker exit(-1) 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker# the path we are checking 104*9880d681SAndroid Build Coastguard Workerpath = str(sys.argv[1]) 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker# check if this is real path 107*9880d681SAndroid Build Coastguard Workerif not os.path.exists(path): 108*9880d681SAndroid Build Coastguard Worker print "path (" + path + ") does not exist" 109*9880d681SAndroid Build Coastguard Worker exit(-1) 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerowners_name = find_owners(path) 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker# be grammatically correct 114*9880d681SAndroid Build Coastguard Workerprint "The owner(s) of the (" + path + ") is(are) : " + str(owners_name) 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerexit(0) 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker# bottom up walk of the current . 119*9880d681SAndroid Build Coastguard Worker# not yet used 120*9880d681SAndroid Build Coastguard Workerroot = "." 121*9880d681SAndroid Build Coastguard Workerfor dir,subdirList,fileList in os.walk( root , topdown=False ) : 122*9880d681SAndroid Build Coastguard Worker print "dir :" , dir 123*9880d681SAndroid Build Coastguard Worker for fname in fileList : 124*9880d681SAndroid Build Coastguard Worker print "-" , fname 125*9880d681SAndroid Build Coastguard Worker print 126