From 6da7944e7dd904e31945dafdf7fe62a708b708b6 Mon Sep 17 00:00:00 2001 From: Pawel Wodnicki Date: Sat, 17 Nov 2012 06:24:37 +0000 Subject: [PATCH] adding whose code is it anywa tools llvm-svn: 168254 --- llvm/utils/wciia.py | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 llvm/utils/wciia.py diff --git a/llvm/utils/wciia.py b/llvm/utils/wciia.py new file mode 100644 index 0000000..d1a96f4 --- /dev/null +++ b/llvm/utils/wciia.py @@ -0,0 +1,125 @@ +#! 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 gramatically 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 -- 2.7.4