1723c394e43e6da91b95ee98775167870aa1c9e57Pawel Wodnicki#!/usr/bin/env python
27e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
37e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki"""
47e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiwciia - Whose Code Is It Anyway
57e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
67e2db212a00f8885740e6791fc7b34d9f969dc21Pawel WodnickiDetermines code owner of the file/folder relative to the llvm source root.
77e2db212a00f8885740e6791fc7b34d9f969dc21Pawel WodnickiCode owner is determined from the content of the CODE_OWNERS.TXT
87e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiby parsing the D: field
97e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
107e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiusage:
117e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
127e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiutils/wciia.py  path
137e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
147e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickilimitations:
157e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- must be run from llvm source root
167e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- very simplistic algorithm
177e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- only handles * as a wildcard
187e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- not very user friendly
197e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki- does not handle the proposed F: field
207e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
217e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki"""
227e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
237e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiimport os
247e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
257e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickicode_owners = {}
267e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
277e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickidef process_files_and_folders(owner):
287e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	filesfolders = owner['filesfolders']
297e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	# paths must be in ( ... ) so strip them
307e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	lpar = filesfolders.find('(')
317e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	rpar = filesfolders.rfind(')')
327e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	if rpar <= lpar:
337e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		# give up
347e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		return
357e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	paths = filesfolders[lpar+1:rpar]
367e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	# split paths
377e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	owner['paths'] = []
387e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	for path in paths.split():
397e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		owner['paths'].append(path)
407e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
417e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickidef process_code_owner(owner):
427e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	if 'filesfolders' in owner:
437e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		filesfolders = owner['filesfolders']
447e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	else:
457e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki#		print "F: field missing, using D: field"
467e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		owner['filesfolders'] = owner['description']
477e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	process_files_and_folders(owner)
487e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	code_owners[owner['name']] = owner
497e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
507e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# process CODE_OWNERS.TXT first
517e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickicode_owners_file = open("CODE_OWNERS.TXT", "r").readlines()
527e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickicode_owner = {}
537e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickifor line in code_owners_file:
547e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki    for word in line.split():
557e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	if word == "N:":
567e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		name = line[2:].strip()
577e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		if code_owner:
587e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki			process_code_owner(code_owner)
597e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki			code_owner = {}
607e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		# reset the values
617e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		code_owner['name'] = name
627e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	if word == "E:":
637e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		email = line[2:].strip()
647e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		code_owner['email'] = email
657e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	if word == "D:":
667e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		description = line[2:].strip()
677e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		code_owner['description'] = description
687e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	if word == "F:":
697e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		filesfolders = line[2:].strip()
707e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		code_owner['filesfolders'].append(filesfolders)
717e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
727e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickidef find_owners(fpath):
737e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	onames = []
747e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	lmatch = -1
757e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	#  very simplistic way of findning the best match
767e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	for name in code_owners:
777e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		owner = code_owners[name]
787e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki		if 'paths' in owner:
797e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki			for path in owner['paths']:
807e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki#				print "searching (" + path + ")"
817e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki				# try exact match
827e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki				if fpath == path:
837e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki					return name
847e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki				# see if path ends with a *
857e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki				rstar = path.rfind('*')
867e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki				if rstar>0:
877e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki					# try the longest match,
887e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki					rpos = -1
897e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki					if len(fpath) < len(path):
907e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki						rpos = path.find(fpath)
917e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki					if rpos == 0:
927e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki						onames.append(name)
937e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	onames.append('Chris Lattner')
947e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	return onames
957e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
967e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# now lest try to find the owner of the file or folder
977e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiimport sys
987e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
997e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiif len(sys.argv) < 2:
1007e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	print "usage " + sys.argv[0] + " file_or_folder"
1017e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	exit(-1)
1027e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
1037e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# the path we are checking
1047e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickipath = str(sys.argv[1])
1057e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
1067e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# check if this is real path
1077e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiif not os.path.exists(path):
1087e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	print "path (" + path + ") does not exist"
1097e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki	exit(-1)
1107e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
1117e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiowners_name = find_owners(path)
1127e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines# be grammatically correct
1147e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiprint "The owner(s) of the (" + path + ") is(are) : " + str(owners_name)
1157e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
1167e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiexit(0)
1177e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki
1187e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# bottom up walk of the current .
1197e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki# not yet used
1207e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickiroot = "."
1217e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnickifor dir,subdirList,fileList in os.walk( root , topdown=False ) :
1227e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki   print "dir :" , dir
1237e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki   for fname in fileList :
1247e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki      print "-" , fname
1257e2db212a00f8885740e6791fc7b34d9f969dc21Pawel Wodnicki   print
126