| #!/usr/bin/env python | 
 |  | 
 | import os | 
 | import sys | 
 | import difflib | 
 | import filecmp | 
 | import tempfile | 
 | from optparse import OptionParser | 
 | from subprocess import call | 
 | from subprocess import Popen | 
 | from subprocess import PIPE | 
 |  | 
 | def which(program): | 
 |     def executable(path): | 
 |         return os.path.isfile(path) and os.access(path, os.X_OK) | 
 |  | 
 |     path, file = os.path.split(program) | 
 |     if path and executable(program): | 
 | 		return program | 
 |     else: | 
 |         for path in os.environ["PATH"].split(os.pathsep): | 
 |             exe = os.path.join(path, program) | 
 |             if executable(exe): | 
 |                 return exe | 
 |     return "" | 
 |  | 
 | DIFF_TOOLS=["meld", "kdiff3", "xdiff", "diffmerge.sh", "diff"] | 
 |  | 
 | PROTO_SRC="./src/com/android/keyguard/" | 
 | PROTO_RES="./res/" | 
 |  | 
 | TEMP_FILE1="/tmp/tempFile1.txt" | 
 | TEMP_FILE2="/tmp/tempFile2.txt" | 
 |  | 
 | FW_SRC="../../../../frameworks/base/policy/src/com/android/internal/policy/impl/keyguard/" | 
 | FW_RES="../../../../frameworks/base/core/res/res/" | 
 |  | 
 | FW_PKG="com.android.internal.policy.impl.keyguard" | 
 | PROTO_PKG="com.android.keyguard" | 
 |  | 
 | FW_RES_IMPORT="import com.android.internal.R;" | 
 |  | 
 | # Find a differ | 
 | DIFF_TOOL="" | 
 | if ("DIFF_TOOL" in os.environ and len(os.environ["DIFF_TOOL"]) > 0): | 
 | 	DIFF_TOOL=which(os.environ["DIFF_TOOL"]) | 
 | if len(DIFF_TOOL) == 0: | 
 | 	for differ in DIFF_TOOLS: | 
 | 		DIFF_TOOL=which(differ) | 
 | 		if len(DIFF_TOOL) > 0: | 
 | 			break | 
 |  | 
 | print "Using differ", DIFF_TOOL | 
 |  | 
 | #Anything file which contains any string in this list as a substring will be ommitted | 
 | IGNORE=["LockHotnessActivity.java", "unified_lock_activity.xml", "optionmenu.xml"] | 
 | WATCH=[] | 
 |  | 
 | def dirCompare(sourceDir, destDir, ext, run_in_reverse): | 
 | 	sourceFiles = getFileList(sourceDir, ext) | 
 | 	destFiles = getFileList(destDir, ext) | 
 | 	for file in sourceFiles: | 
 | 		print file | 
 | 		destFile = destDir + file | 
 | 		sourceFile = sourceDir + file | 
 | 		if (file in destFiles): | 
 | 			if run_in_reverse: | 
 | 				prepareFileForCompare(sourceFile, TEMP_FILE1, FW_RES_IMPORT, FW_PKG, PROTO_PKG) | 
 | 				prepareFileForCompare(destFile, TEMP_FILE2, FW_RES_IMPORT,) | 
 | 			else: | 
 | 				prepareFileForCompare(destFile, TEMP_FILE1, FW_RES_IMPORT, FW_PKG, PROTO_PKG) | 
 | 				prepareFileForCompare(sourceFile, TEMP_FILE2, FW_RES_IMPORT,) | 
 | 			if (filecmp.cmp(TEMP_FILE1, TEMP_FILE2)): | 
 | 				print "File %s is the same in proto and framework" %(file) | 
 | 			else: | 
 | 				print "Running diff for: %s" %(file) | 
 | 				diff(sourceFile, destFile) | 
 | 		else: | 
 | 			print "File %s does not exist in framework" %(file) | 
 | 			if not run_in_reverse: | 
 | 				diff(sourceFile, destFile) | 
 |  | 
 | def main(argv): | 
 | 	run_in_reverse = False | 
 | 	if len(argv) > 1: | 
 | 		if argv[1] == '--help' or argv[1] == '-h': | 
 | 			print ('Usage: %s [<commit>]' % argv[0]) | 
 | 			print ('\tdiff to framework, ' + | 
 | 					'optionally restricting to files in <commit>') | 
 | 			sys.exit(0) | 
 | 		elif argv[1] == '--reverse': | 
 | 			print "Running in reverse" | 
 | 			run_in_reverse = True | 
 | 		else: | 
 | 			print ("**** Pulling file list from: %s" % argv[1]) | 
 | 			pipe = Popen(['git', 'diff', '--name-only',  argv[1]], stdout=PIPE).stdout | 
 | 			for line in iter(pipe.readline,''): | 
 | 				path = line.rstrip() | 
 | 				file = path[path.rfind('/') + 1:] | 
 | 				print '**** watching: %s' % file | 
 | 				WATCH.append(file); | 
 | 			pipe.close() | 
 |  | 
 | 	if run_in_reverse: | 
 | 		#dirCompare(FW_RES, PROTO_RES, ".xml", run_in_reverse) | 
 | 		print ("**** Source files:") | 
 | 		dirCompare(FW_SRC, PROTO_SRC, ".java", run_in_reverse) | 
 | 	else: | 
 | 		#dirCompare(PROTO_RES, FW_RES, ".xml", run_in_reverse) | 
 | 		print ("**** Source files:") | 
 | 		dirCompare(PROTO_SRC, FW_SRC, ".java", run_in_reverse) | 
 |  | 
 | 	if (os.path.exists(TEMP_FILE1)): | 
 | 		os.remove(TEMP_FILE1) | 
 |  | 
 | 	if (os.path.exists(TEMP_FILE2)): | 
 | 		os.remove(TEMP_FILE2) | 
 |  | 
 | def getFileList(rootdir, extension): | 
 | 	fileList = [] | 
 |  | 
 | 	for root, subFolders, files in os.walk(rootdir): | 
 | 	    for file in files: | 
 | 	        f = os.path.join(root,file) | 
 | 	        if (os.path.splitext(f)[1] == extension and (not inIgnore(f))): | 
 | 	        	fileList.append(f[len(rootdir):]) | 
 | 	return fileList | 
 |  | 
 |  | 
 | def prepareFileForCompare(inFile, outFile, skip="", replace="", withText=""): | 
 | 	# Delete the outfile, so we're starting with a new file | 
 | 	if (os.path.exists(outFile)): | 
 | 		os.remove(outFile) | 
 |  | 
 | 	fin = open(inFile) | 
 | 	fout = open(outFile, "w") | 
 | 	for line in fin: | 
 | 		# Ignore any lines containing the ignore string ("import com.android.internal.R;) and | 
 | 		# ignore any lines containing only whitespace. | 
 | 		if (line.find(skip) < 0  and len(line.strip(' \t\n\r')) > 0): | 
 | 			# For comparison, for framework files, we replace the fw package with the | 
 | 			# proto package, since these aren't relevant. | 
 | 			if len(replace) > 0: | 
 | 				fout.write(line.replace(replace, withText)) | 
 | 			else: | 
 | 				fout.write(line) | 
 | 	fin.close() | 
 | 	fout.close() | 
 |  | 
 | def diff(file1, file2): | 
 | 	call([DIFF_TOOL, file1, file2]) | 
 |  | 
 | def inIgnore(file): | 
 | 	for ignore in IGNORE: | 
 | 		if file.find(ignore) >= 0: | 
 | 			return True | 
 |         if len(WATCH) > 0: | 
 |             for watch in WATCH: | 
 | 		if file.find(watch) >= 0: | 
 |                     return False | 
 |             return True | 
 | 	return False | 
 |  | 
 | if __name__=="__main__": | 
 |   main(sys.argv) |