xref: /aosp_15_r20/external/llvm/utils/wciia.py (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/env python
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker"""
4*9880d681SAndroid Build Coastguard Workerwciia - Whose Code Is It Anyway
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard WorkerDetermines code owner of the file/folder relative to the llvm source root.
7*9880d681SAndroid Build Coastguard WorkerCode owner is determined from the content of the CODE_OWNERS.TXT
8*9880d681SAndroid Build Coastguard Workerby parsing the D: field
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerusage:
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerutils/wciia.py  path
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerlimitations:
15*9880d681SAndroid Build Coastguard Worker- must be run from llvm source root
16*9880d681SAndroid Build Coastguard Worker- very simplistic algorithm
17*9880d681SAndroid Build Coastguard Worker- only handles * as a wildcard
18*9880d681SAndroid Build Coastguard Worker- not very user friendly
19*9880d681SAndroid Build Coastguard Worker- does not handle the proposed F: field
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker"""
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerimport os
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workercode_owners = {}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdef process_files_and_folders(owner):
28*9880d681SAndroid Build Coastguard Worker	filesfolders = owner['filesfolders']
29*9880d681SAndroid Build Coastguard Worker	# paths must be in ( ... ) so strip them
30*9880d681SAndroid Build Coastguard Worker	lpar = filesfolders.find('(')
31*9880d681SAndroid Build Coastguard Worker	rpar = filesfolders.rfind(')')
32*9880d681SAndroid Build Coastguard Worker	if rpar <= lpar:
33*9880d681SAndroid Build Coastguard Worker		# give up
34*9880d681SAndroid Build Coastguard Worker		return
35*9880d681SAndroid Build Coastguard Worker	paths = filesfolders[lpar+1:rpar]
36*9880d681SAndroid Build Coastguard Worker	# split paths
37*9880d681SAndroid Build Coastguard Worker	owner['paths'] = []
38*9880d681SAndroid Build Coastguard Worker	for path in paths.split():
39*9880d681SAndroid Build Coastguard Worker		owner['paths'].append(path)
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdef process_code_owner(owner):
42*9880d681SAndroid Build Coastguard Worker	if 'filesfolders' in owner:
43*9880d681SAndroid Build Coastguard Worker		filesfolders = owner['filesfolders']
44*9880d681SAndroid Build Coastguard Worker	else:
45*9880d681SAndroid Build Coastguard Worker#		print "F: field missing, using D: field"
46*9880d681SAndroid Build Coastguard Worker		owner['filesfolders'] = owner['description']
47*9880d681SAndroid Build Coastguard Worker	process_files_and_folders(owner)
48*9880d681SAndroid Build Coastguard Worker	code_owners[owner['name']] = owner
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker# process CODE_OWNERS.TXT first
51*9880d681SAndroid Build Coastguard Workercode_owners_file = open("CODE_OWNERS.TXT", "r").readlines()
52*9880d681SAndroid Build Coastguard Workercode_owner = {}
53*9880d681SAndroid Build Coastguard Workerfor line in code_owners_file:
54*9880d681SAndroid Build Coastguard Worker    for word in line.split():
55*9880d681SAndroid Build Coastguard Worker	if word == "N:":
56*9880d681SAndroid Build Coastguard Worker		name = line[2:].strip()
57*9880d681SAndroid Build Coastguard Worker		if code_owner:
58*9880d681SAndroid Build Coastguard Worker			process_code_owner(code_owner)
59*9880d681SAndroid Build Coastguard Worker			code_owner = {}
60*9880d681SAndroid Build Coastguard Worker		# reset the values
61*9880d681SAndroid Build Coastguard Worker		code_owner['name'] = name
62*9880d681SAndroid Build Coastguard Worker	if word == "E:":
63*9880d681SAndroid Build Coastguard Worker		email = line[2:].strip()
64*9880d681SAndroid Build Coastguard Worker		code_owner['email'] = email
65*9880d681SAndroid Build Coastguard Worker	if word == "D:":
66*9880d681SAndroid Build Coastguard Worker		description = line[2:].strip()
67*9880d681SAndroid Build Coastguard Worker		code_owner['description'] = description
68*9880d681SAndroid Build Coastguard Worker	if word == "F:":
69*9880d681SAndroid Build Coastguard Worker		filesfolders = line[2:].strip()
70*9880d681SAndroid Build Coastguard Worker		code_owner['filesfolders'].append(filesfolders)
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdef find_owners(fpath):
73*9880d681SAndroid Build Coastguard Worker	onames = []
74*9880d681SAndroid Build Coastguard Worker	lmatch = -1
75*9880d681SAndroid Build Coastguard Worker	#  very simplistic way of findning the best match
76*9880d681SAndroid Build Coastguard Worker	for name in code_owners:
77*9880d681SAndroid Build Coastguard Worker		owner = code_owners[name]
78*9880d681SAndroid Build Coastguard Worker		if 'paths' in owner:
79*9880d681SAndroid Build Coastguard Worker			for path in owner['paths']:
80*9880d681SAndroid Build Coastguard Worker#				print "searching (" + path + ")"
81*9880d681SAndroid Build Coastguard Worker				# try exact match
82*9880d681SAndroid Build Coastguard Worker				if fpath == path:
83*9880d681SAndroid Build Coastguard Worker					return name
84*9880d681SAndroid Build Coastguard Worker				# see if path ends with a *
85*9880d681SAndroid Build Coastguard Worker				rstar = path.rfind('*')
86*9880d681SAndroid Build Coastguard Worker				if rstar>0:
87*9880d681SAndroid Build Coastguard Worker					# try the longest match,
88*9880d681SAndroid Build Coastguard Worker					rpos = -1
89*9880d681SAndroid Build Coastguard Worker					if len(fpath) < len(path):
90*9880d681SAndroid Build Coastguard Worker						rpos = path.find(fpath)
91*9880d681SAndroid Build Coastguard Worker					if rpos == 0:
92*9880d681SAndroid Build Coastguard Worker						onames.append(name)
93*9880d681SAndroid Build Coastguard Worker	onames.append('Chris Lattner')
94*9880d681SAndroid Build Coastguard Worker	return onames
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker# now lest try to find the owner of the file or folder
97*9880d681SAndroid Build Coastguard Workerimport sys
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerif len(sys.argv) < 2:
100*9880d681SAndroid Build Coastguard Worker	print "usage " + sys.argv[0] + " file_or_folder"
101*9880d681SAndroid Build Coastguard Worker	exit(-1)
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker# the path we are checking
104*9880d681SAndroid Build Coastguard Workerpath = str(sys.argv[1])
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker# check if this is real path
107*9880d681SAndroid Build Coastguard Workerif not os.path.exists(path):
108*9880d681SAndroid Build Coastguard Worker	print "path (" + path + ") does not exist"
109*9880d681SAndroid Build Coastguard Worker	exit(-1)
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerowners_name = find_owners(path)
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker# be grammatically correct
114*9880d681SAndroid Build Coastguard Workerprint "The owner(s) of the (" + path + ") is(are) : " + str(owners_name)
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerexit(0)
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker# bottom up walk of the current .
119*9880d681SAndroid Build Coastguard Worker# not yet used
120*9880d681SAndroid Build Coastguard Workerroot = "."
121*9880d681SAndroid Build Coastguard Workerfor dir,subdirList,fileList in os.walk( root , topdown=False ) :
122*9880d681SAndroid Build Coastguard Worker   print "dir :" , dir
123*9880d681SAndroid Build Coastguard Worker   for fname in fileList :
124*9880d681SAndroid Build Coastguard Worker      print "-" , fname
125*9880d681SAndroid Build Coastguard Worker   print
126