15ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller#!/usr/bin/env python
25ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
35ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport os
45ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport sys
55ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport difflib
65ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport filecmp
75ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport tempfile
85ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerfrom optparse import OptionParser
95ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerfrom subprocess import call
105ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerfrom subprocess import Popen
115ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerfrom subprocess import PIPE
125ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
135ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerdef which(program):
145ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller    def executable(path):
155ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller        return os.path.isfile(path) and os.access(path, os.X_OK)
165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller    path, file = os.path.split(program)
185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller    if path and executable(program):
195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		return program
205ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller    else:
215ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller        for path in os.environ["PATH"].split(os.pathsep):
225ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller            exe = os.path.join(path, program)
235ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller            if executable(exe):
245ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                return exe
255ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller    return ""
265ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
275ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerDIFF_TOOLS=["meld", "kdiff3", "xdiff", "diffmerge.sh", "diff"]
285ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
295ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerPROTO_SRC="./src/com/android/keyguard/"
305ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerPROTO_RES="./res/"
315ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
325ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerTEMP_FILE1="/tmp/tempFile1.txt"
335ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerTEMP_FILE2="/tmp/tempFile2.txt"
345ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
355ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerFW_SRC="../../../../frameworks/base/policy/src/com/android/internal/policy/impl/keyguard/"
365ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerFW_RES="../../../../frameworks/base/core/res/res/"
375ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
385ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerFW_PKG="com.android.internal.policy.impl.keyguard"
395ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerPROTO_PKG="com.android.keyguard"
405ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
415ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerFW_RES_IMPORT="import com.android.internal.R;"
425ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
435ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller# Find a differ
445ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerDIFF_TOOL=""
455ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerif ("DIFF_TOOL" in os.environ and len(os.environ["DIFF_TOOL"]) > 0):
465ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	DIFF_TOOL=which(os.environ["DIFF_TOOL"])
475ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerif len(DIFF_TOOL) == 0:
485ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	for differ in DIFF_TOOLS:
495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		DIFF_TOOL=which(differ)
505ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		if len(DIFF_TOOL) > 0:
515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			break
525ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerprint "Using differ", DIFF_TOOL
545ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
555ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller#Anything file which contains any string in this list as a substring will be ommitted
565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerIGNORE=["LockHotnessActivity.java", "unified_lock_activity.xml", "optionmenu.xml"]
575ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim MillerWATCH=[]
585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerdef dirCompare(sourceDir, destDir, ext, run_in_reverse):
605ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	sourceFiles = getFileList(sourceDir, ext)
615ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	destFiles = getFileList(destDir, ext)
625ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	for file in sourceFiles:
635ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		print file
645ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		destFile = destDir + file
655ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		sourceFile = sourceDir + file
665ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		if (file in destFiles):
675ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			if run_in_reverse:
685ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				prepareFileForCompare(sourceFile, TEMP_FILE1, FW_RES_IMPORT, FW_PKG, PROTO_PKG)
695ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				prepareFileForCompare(destFile, TEMP_FILE2, FW_RES_IMPORT,)
705ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			else:
715ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				prepareFileForCompare(destFile, TEMP_FILE1, FW_RES_IMPORT, FW_PKG, PROTO_PKG)
725ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				prepareFileForCompare(sourceFile, TEMP_FILE2, FW_RES_IMPORT,)
735ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			if (filecmp.cmp(TEMP_FILE1, TEMP_FILE2)):
745ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				print "File %s is the same in proto and framework" %(file)
755ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			else:
765ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				print "Running diff for: %s" %(file)
775ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				diff(sourceFile, destFile)
785ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		else:
795ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			print "File %s does not exist in framework" %(file)
805ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			if not run_in_reverse:
815ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				diff(sourceFile, destFile)
825ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
835ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerdef main(argv):
845ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	run_in_reverse = False
855ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	if len(argv) > 1:
865ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		if argv[1] == '--help' or argv[1] == '-h':
875ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			print ('Usage: %s [<commit>]' % argv[0])
885ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			print ('\tdiff to framework, ' +
895ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller					'optionally restricting to files in <commit>')
905ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			sys.exit(0)
915ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		elif argv[1] == '--reverse':
925ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			print "Running in reverse"
935ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			run_in_reverse = True
945ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		else:
955ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			print ("**** Pulling file list from: %s" % argv[1])
965ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			pipe = Popen(['git', 'diff', '--name-only',  argv[1]], stdout=PIPE).stdout
975ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			for line in iter(pipe.readline,''):
985ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				path = line.rstrip()
995ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				file = path[path.rfind('/') + 1:]
1005ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				print '**** watching: %s' % file
1015ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				WATCH.append(file);
1025ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			pipe.close()
1035ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1045ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	if run_in_reverse:
1055ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		#dirCompare(FW_RES, PROTO_RES, ".xml", run_in_reverse)
1065ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		print ("**** Source files:")
1075ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		dirCompare(FW_SRC, PROTO_SRC, ".java", run_in_reverse)
1085ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	else:
1095ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		#dirCompare(PROTO_RES, FW_RES, ".xml", run_in_reverse)
1105ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		print ("**** Source files:")
1115ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		dirCompare(PROTO_SRC, FW_SRC, ".java", run_in_reverse)
1125ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1135ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	if (os.path.exists(TEMP_FILE1)):
1145ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		os.remove(TEMP_FILE1)
1155ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	if (os.path.exists(TEMP_FILE2)):
1175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		os.remove(TEMP_FILE2)
1185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerdef getFileList(rootdir, extension):
1205ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	fileList = []
1215ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1225ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	for root, subFolders, files in os.walk(rootdir):
1235ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	    for file in files:
1245ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	        f = os.path.join(root,file)
1255ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	        if (os.path.splitext(f)[1] == extension and (not inIgnore(f))):
1265ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	        	fileList.append(f[len(rootdir):])
1275ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	return fileList
1285ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1295ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1305ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerdef prepareFileForCompare(inFile, outFile, skip="", replace="", withText=""):
1315ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	# Delete the outfile, so we're starting with a new file
1325ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	if (os.path.exists(outFile)):
1335ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		os.remove(outFile)
1345ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1355ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	fin = open(inFile)
1365ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	fout = open(outFile, "w")
1375ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	for line in fin:
1385ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		# Ignore any lines containing the ignore string ("import com.android.internal.R;) and
1395ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		# ignore any lines containing only whitespace.
1405ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		if (line.find(skip) < 0  and len(line.strip(' \t\n\r')) > 0):
1415ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			# For comparison, for framework files, we replace the fw package with the
1425ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			# proto package, since these aren't relevant.
1435ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			if len(replace) > 0:
1445ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				fout.write(line.replace(replace, withText))
1455ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			else:
1465ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller				fout.write(line)
1475ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	fin.close()
1485ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	fout.close()
1495ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1505ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerdef diff(file1, file2):
1515ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	call([DIFF_TOOL, file1, file2])
1525ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerdef inIgnore(file):
1545ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	for ignore in IGNORE:
1555ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		if file.find(ignore) >= 0:
1565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller			return True
1575ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller        if len(WATCH) > 0:
1585ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller            for watch in WATCH:
1595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller		if file.find(watch) >= 0:
1605ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                    return False
1615ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller            return True
1625ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller	return False
1635ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller
1645ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerif __name__=="__main__":
1655ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller  main(sys.argv)
166