| #!/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() |