| #!/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 |
| |
| """ |
| |
| 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 |