|  | #!/usr/bin/env python | 
|  |  | 
|  | """ | 
|  | wciia - Whose Code Is It Anyway | 
|  |  | 
|  | Determines code owner of the file/folder relative to the llvm source root. | 
|  | Code owner is determined from the content of the CODE_OWNERS.TXT | 
|  | by parsing the D: field | 
|  |  | 
|  | usage: | 
|  |  | 
|  | utils/wciia.py  path | 
|  |  | 
|  | limitations: | 
|  | - must be run from llvm source root | 
|  | - very simplistic algorithm | 
|  | - only handles * as a wildcard | 
|  | - not very user friendly | 
|  | - does not handle the proposed F: field | 
|  |  | 
|  | """ | 
|  |  | 
|  | from __future__ import print_function | 
|  | import os | 
|  |  | 
|  | code_owners = {} | 
|  |  | 
|  | def process_files_and_folders(owner): | 
|  | filesfolders = owner['filesfolders'] | 
|  | # paths must be in ( ... ) so strip them | 
|  | lpar = filesfolders.find('(') | 
|  | rpar = filesfolders.rfind(')') | 
|  | if rpar <= lpar: | 
|  | # give up | 
|  | return | 
|  | paths = filesfolders[lpar+1:rpar] | 
|  | # split paths | 
|  | owner['paths'] = [] | 
|  | for path in paths.split(): | 
|  | owner['paths'].append(path) | 
|  |  | 
|  | def process_code_owner(owner): | 
|  | if 'filesfolders' in owner: | 
|  | filesfolders = owner['filesfolders'] | 
|  | else: | 
|  | #		print "F: field missing, using D: field" | 
|  | owner['filesfolders'] = owner['description'] | 
|  | process_files_and_folders(owner) | 
|  | code_owners[owner['name']] = owner | 
|  |  | 
|  | # process CODE_OWNERS.TXT first | 
|  | code_owners_file = open("CODE_OWNERS.TXT", "r").readlines() | 
|  | code_owner = {} | 
|  | for line in code_owners_file: | 
|  | for word in line.split(): | 
|  | if word == "N:": | 
|  | name = line[2:].strip() | 
|  | if code_owner: | 
|  | process_code_owner(code_owner) | 
|  | code_owner = {} | 
|  | # reset the values | 
|  | code_owner['name'] = name | 
|  | if word == "E:": | 
|  | email = line[2:].strip() | 
|  | code_owner['email'] = email | 
|  | if word == "D:": | 
|  | description = line[2:].strip() | 
|  | code_owner['description'] = description | 
|  | if word == "F:": | 
|  | filesfolders = line[2:].strip() | 
|  | code_owner['filesfolders'].append(filesfolders) | 
|  |  | 
|  | def find_owners(fpath): | 
|  | onames = [] | 
|  | lmatch = -1 | 
|  | #  very simplistic way of findning the best match | 
|  | for name in code_owners: | 
|  | owner = code_owners[name] | 
|  | if 'paths' in owner: | 
|  | for path in owner['paths']: | 
|  | #				print "searching (" + path + ")" | 
|  | # try exact match | 
|  | if fpath == path: | 
|  | return name | 
|  | # see if path ends with a * | 
|  | rstar = path.rfind('*') | 
|  | if rstar>0: | 
|  | # try the longest match, | 
|  | rpos = -1 | 
|  | if len(fpath) < len(path): | 
|  | rpos = path.find(fpath) | 
|  | if rpos == 0: | 
|  | onames.append(name) | 
|  | onames.append('Chris Lattner') | 
|  | return onames | 
|  |  | 
|  | # now lest try to find the owner of the file or folder | 
|  | import sys | 
|  |  | 
|  | if len(sys.argv) < 2: | 
|  | print("usage " + sys.argv[0] + " file_or_folder") | 
|  | exit(-1) | 
|  |  | 
|  | # the path we are checking | 
|  | path = str(sys.argv[1]) | 
|  |  | 
|  | # check if this is real path | 
|  | if not os.path.exists(path): | 
|  | print("path (" + path + ") does not exist") | 
|  | exit(-1) | 
|  |  | 
|  | owners_name = find_owners(path) | 
|  |  | 
|  | # be grammatically correct | 
|  | print("The owner(s) of the (" + path + ") is(are) : " + str(owners_name)) | 
|  |  | 
|  | exit(0) | 
|  |  | 
|  | # bottom up walk of the current . | 
|  | # not yet used | 
|  | root = "." | 
|  | for dir,subdirList,fileList in os.walk( root , topdown=False ) : | 
|  | print("dir :" , dir) | 
|  | for fname in fileList : | 
|  | print("-" , fname) | 
|  | print() |