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