1723c394e43e6da91b95ee98775167870aa1c9e57Pawel Wodnicki#!/usr/bin/env python 27e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 37e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki""" 47e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiwciia - Whose Code Is It Anyway 57e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 67e2db212a00f8885740e6791fc7b34d9f969dc21Pawel WodnickiDetermines code owner of the file/folder relative to the llvm source root. 77e2db212a00f8885740e6791fc7b34d9f969dc21Pawel WodnickiCode owner is determined from the content of the CODE_OWNERS.TXT 87e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiby parsing the D: field 97e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 107e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiusage: 117e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 127e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiutils/wciia.py path 137e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 147e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickilimitations: 157e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- must be run from llvm source root 167e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- very simplistic algorithm 177e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- only handles * as a wildcard 187e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- not very user friendly 197e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- does not handle the proposed F: field 207e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 217e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki""" 227e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 237e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiimport os 247e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 257e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickicode_owners = {} 267e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 277e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickidef process_files_and_folders(owner): 287e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki filesfolders = owner['filesfolders'] 297e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # paths must be in ( ... ) so strip them 307e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki lpar = filesfolders.find('(') 317e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki rpar = filesfolders.rfind(')') 327e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if rpar <= lpar: 337e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # give up 347e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki return 357e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki paths = filesfolders[lpar+1:rpar] 367e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # split paths 377e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki owner['paths'] = [] 387e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki for path in paths.split(): 397e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki owner['paths'].append(path) 407e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 417e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickidef process_code_owner(owner): 427e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if 'filesfolders' in owner: 437e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki filesfolders = owner['filesfolders'] 447e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki else: 457e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# print "F: field missing, using D: field" 467e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki owner['filesfolders'] = owner['description'] 477e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki process_files_and_folders(owner) 487e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki code_owners[owner['name']] = owner 497e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 507e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# process CODE_OWNERS.TXT first 517e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickicode_owners_file = open("CODE_OWNERS.TXT", "r").readlines() 527e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickicode_owner = {} 537e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickifor line in code_owners_file: 547e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki for word in line.split(): 557e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if word == "N:": 567e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki name = line[2:].strip() 577e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if code_owner: 587e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki process_code_owner(code_owner) 597e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki code_owner = {} 607e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # reset the values 617e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki code_owner['name'] = name 627e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if word == "E:": 637e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki email = line[2:].strip() 647e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki code_owner['email'] = email 657e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if word == "D:": 667e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki description = line[2:].strip() 677e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki code_owner['description'] = description 687e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if word == "F:": 697e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki filesfolders = line[2:].strip() 707e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki code_owner['filesfolders'].append(filesfolders) 717e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 727e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickidef find_owners(fpath): 737e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki onames = [] 747e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki lmatch = -1 757e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # very simplistic way of findning the best match 767e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki for name in code_owners: 777e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki owner = code_owners[name] 787e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if 'paths' in owner: 797e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki for path in owner['paths']: 807e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# print "searching (" + path + ")" 817e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # try exact match 827e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if fpath == path: 837e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki return name 847e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # see if path ends with a * 857e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki rstar = path.rfind('*') 867e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if rstar>0: 877e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki # try the longest match, 887e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki rpos = -1 897e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if len(fpath) < len(path): 907e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki rpos = path.find(fpath) 917e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki if rpos == 0: 927e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki onames.append(name) 937e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki onames.append('Chris Lattner') 947e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki return onames 957e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 967e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# now lest try to find the owner of the file or folder 977e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiimport sys 987e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 997e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiif len(sys.argv) < 2: 1007e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki print "usage " + sys.argv[0] + " file_or_folder" 1017e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki exit(-1) 1027e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 1037e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# the path we are checking 1047e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickipath = str(sys.argv[1]) 1057e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 1067e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# check if this is real path 1077e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiif not os.path.exists(path): 1087e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki print "path (" + path + ") does not exist" 1097e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki exit(-1) 1107e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 1117e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiowners_name = find_owners(path) 1127e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines# be grammatically correct 1147e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiprint "The owner(s) of the (" + path + ") is(are) : " + str(owners_name) 1157e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 1167e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiexit(0) 1177e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki 1187e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# bottom up walk of the current . 1197e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# not yet used 1207e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiroot = "." 1217e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickifor dir,subdirList,fileList in os.walk( root , topdown=False ) : 1227e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki print "dir :" , dir 1237e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki for fname in fileList : 1247e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki print "-" , fname 1257e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki print 126