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