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