ownermetrics.py #1

  • //
  • guest/
  • russell_jackson/
  • metrics/
  • ownermetrics.py
  • View
  • Commits
  • Open Download .zip Download (6 KB)
#!/usr/local/bin/python
# usermetrics.py
# 
# imports
import sys, os, string, re, isitalabel, smtplib

debug = 0
lines = []
diffs = []
mailhost = 'mail.symantec.com'
sleeptime = 60
try:
	fromaddr = os.environ['EMAIL']
except:
	print "No email address found in environment, using cm@symantec.com\n"
	fromaddr = 'cm@symantec.com'	
###################################################################################################################
USAGE = """
Usage: 
This command requires the current build label as a parameter.

For Example:
	python usermetrics.py JACKALOPE.17
"""
###################################################################################################################
# This will send out an email.
def sendit (emailaddress, email):
	try:
		mailport=smtplib.SMTP(mailhost)
	except:
		sys.stderr.write('Unable to connect to SMTP host "' + mailhost + '"!\n')
		return
	message = ""	
	for line in email:
		message = message + line
		
	message = message + """
	====================
	   From: CM Team
	   cm.symantec.com
	====================
	"""
	
	mailport.sendmail(fromaddr, emailaddress,'TO: ' + emailaddress + '\nSubject: CM Change report for ' + sys.argv[1] +'\n\n' + message)
	
	mailport.quit()
###################################################################################################################
# This will check to see that file_ownerships.txt exists under the label
def checkforfile (labelname):
	# p4 files @label
	found = 0
	if debug > 0:
		print labelname
	for line in os.popen ('p4' + ' files @' + labelname, 'r').readlines():
		if debug > 0:
			print line
		name = filename_pattern.match (line)
		if name != None:
			thestring = name.group()
			thelist = string.split(thestring)
			if debug > 0:
				print thelist[0]
			ownerships = thelist[0]
			found = found + 1
	
	if found == 0:
		print "file_ownerships.txt not found under label '" + labelname + "', ownermetrics will not be generated"
		return 1
	if found > 1:
		print "Multiple copies of file_ownerships.txt were found under the label '" + labelname + "', ownermetrics will not be generated"
		return 2
	return ownerships
	
###################################################################################################################
# This will read in the metrics to be parsed for users and files in file_ownerships.txt
def readmetrics (ownerships):
	for line in os.popen ('p4 print -q ' + ownerships, 'r').readlines():
		x = string.find (line, '#')
		if debug > 0:
			print x
		if x != -1:
			if x == 0:
				pass
			else:
				lines.append (line[0,x])
		else:	
			lines.append (line)
	return
###################################################################################################################
# This will open the source_code_diffs file
def readdiffs ():
	if sys.platform == "win32":
		try:
			file = open ("c:\\build\\" + sys.argv[1] + ".source_code_diffs")
		except:
			print "Could not open c:\\build\\" + sys.argv[1] + ".source_code_diffs for reading."
			print "You must first run diff.py on this label to generate this file.  If you are running the main metrics.py make sure the second label comes second."
			return 1
	else:
		try:
			file = open ("metrics" + os.sep + sys.argv[1] + ".source_code_diffs")
		except:
			print "Could not open metrics" + os.sep + sys.argv[1] + ".source_code_diffs for reading."
			print "You must first run diff.py on this label to generate this file.  If you are running the main metrics.py make sure the second label comes second."
			return 1
	
	for line in file.readlines ():
		diffs.append (line) 
	return 0

###################################################################################################################
# This will match lines with diffs in the diffs file
def parse (line):
	
	if debug > 0:
		print "CALLING parse()"
	
	theline = string.split (line,',')
	file_loc = string.strip (theline[0])
	emailaddress = string.strip (theline [3])
	email = []
	if file_loc[0] == "\"" and file_loc[-1] == "\"":
		file_loc =  file_loc [1:-1]
		
	file_pattern = re.compile ('==== ' + file_loc + '#', re.IGNORECASE)	
	new_file_pattern = re.compile ('==== //.*', re.IGNORECASE)
	found = None
	newfile = None
	if debug > 0:
		linenumber = 0
	
	for line in diffs:
		if debug > 0:
			linenumber  = linenumber  + 1
			print "linenumber = " + str(linenumber) + ";found = " + str(found) + ";newfile = " + str(newfile)
		if found == None:
			newfile = new_file_pattern.match (line)
			if (newfile != None):
				found = file_pattern.match (line)
				if found != None:
					email.append (line)
		else:
			newfile = new_file_pattern.match (line)
			if newfile != None:
				found = None
			else:
				email.append (line)
	sendit (emailaddress, email)	

###################################################################################################################
# This will create the individual reports for users
def buildfiles ():
	return

###################################################################################################################
# This will mail those files out to the users
def mailfiles ():
	return 0
	
###################################################################################################################
if __name__ == '__main__':
	if len (sys.argv) < 2:
		print USAGE
		sys.exit (1)
	x = isitalabel.check(sys.argv[1])
	if x == 0:
		print "There is no label " + sys.argv[1]
		sys.exit(1)
	filename_pattern = re.compile ('.*/file_ownerships.txt#.*', re.IGNORECASE)
	
	# check for the file_ownerships.txt file
	ownerships = checkforfile(sys.argv[1])
	if debug > 0:
		print ownerships
	if (ownerships == 1) or (ownerships == 2):
		sys.exit(1)
	
	# check for the source_code_diffs file
	error = readdiffs ()	
	if error != 0:
		sys.exit (error)
		
	readmetrics (ownerships)
	
	for line in lines:
		parse (line)
# Change User Description Committed
#1 1962 Russell C. Jackson (Rusty) Adding latest metrics file.