127 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/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()
 |