1*9e94795aSAndroid Build Coastguard Worker#!/usr/bin/python -E 2*9e94795aSAndroid Build Coastguard Worker 3*9e94795aSAndroid Build Coastguard Workerimport sys, os, re 4*9e94795aSAndroid Build Coastguard Worker 5*9e94795aSAndroid Build Coastguard Workerexcludes = [r'.*?/\.obj.*?', 6*9e94795aSAndroid Build Coastguard Worker r'.*?~', 7*9e94795aSAndroid Build Coastguard Worker r'.*?\/.DS_Store', 8*9e94795aSAndroid Build Coastguard Worker r'.*?\/.gdb_history', 9*9e94795aSAndroid Build Coastguard Worker r'.*?\/buildspec.mk', 10*9e94795aSAndroid Build Coastguard Worker r'.*?/\..*?\.swp', 11*9e94795aSAndroid Build Coastguard Worker r'.*?/out/.*?', 12*9e94795aSAndroid Build Coastguard Worker r'.*?/install/.*?'] 13*9e94795aSAndroid Build Coastguard Worker 14*9e94795aSAndroid Build Coastguard Workerexcludes_compiled = map(re.compile, excludes) 15*9e94795aSAndroid Build Coastguard Worker 16*9e94795aSAndroid Build Coastguard Workerdef filter_excludes(str): 17*9e94795aSAndroid Build Coastguard Worker for e in excludes_compiled: 18*9e94795aSAndroid Build Coastguard Worker if e.match(str): 19*9e94795aSAndroid Build Coastguard Worker return False 20*9e94795aSAndroid Build Coastguard Worker return True 21*9e94795aSAndroid Build Coastguard Worker 22*9e94795aSAndroid Build Coastguard Workerdef split_perforce_parts(s): 23*9e94795aSAndroid Build Coastguard Worker spaces = ((s.count(" ") + 1) / 3) * 2 24*9e94795aSAndroid Build Coastguard Worker pos = 0 25*9e94795aSAndroid Build Coastguard Worker while spaces > 0: 26*9e94795aSAndroid Build Coastguard Worker pos = s.find(" ", pos) + 1 27*9e94795aSAndroid Build Coastguard Worker spaces = spaces - 1 28*9e94795aSAndroid Build Coastguard Worker return s[pos:] 29*9e94795aSAndroid Build Coastguard Worker 30*9e94795aSAndroid Build Coastguard Workerdef quotate(s): 31*9e94795aSAndroid Build Coastguard Worker return '"' + s + '"' 32*9e94795aSAndroid Build Coastguard Worker 33*9e94795aSAndroid Build Coastguard Workerclass PerforceError(Exception): 34*9e94795aSAndroid Build Coastguard Worker def __init__(self,value): 35*9e94795aSAndroid Build Coastguard Worker self.value = value 36*9e94795aSAndroid Build Coastguard Worker def __str__(self): 37*9e94795aSAndroid Build Coastguard Worker return repr(self.value) 38*9e94795aSAndroid Build Coastguard Worker 39*9e94795aSAndroid Build Coastguard Worker 40*9e94795aSAndroid Build Coastguard Workerdef run(command, regex, filt): 41*9e94795aSAndroid Build Coastguard Worker def matchit(s): 42*9e94795aSAndroid Build Coastguard Worker m = regex_compiled.match(s) 43*9e94795aSAndroid Build Coastguard Worker if m: 44*9e94795aSAndroid Build Coastguard Worker return m.group(1) 45*9e94795aSAndroid Build Coastguard Worker else: 46*9e94795aSAndroid Build Coastguard Worker return "" 47*9e94795aSAndroid Build Coastguard Worker def filterit(s): 48*9e94795aSAndroid Build Coastguard Worker if filt_compiled.match(s): 49*9e94795aSAndroid Build Coastguard Worker return True 50*9e94795aSAndroid Build Coastguard Worker else: 51*9e94795aSAndroid Build Coastguard Worker return False 52*9e94795aSAndroid Build Coastguard Worker 53*9e94795aSAndroid Build Coastguard Worker fd = os.popen(command); 54*9e94795aSAndroid Build Coastguard Worker lines = fd.readlines() 55*9e94795aSAndroid Build Coastguard Worker status = fd.close() 56*9e94795aSAndroid Build Coastguard Worker if status: 57*9e94795aSAndroid Build Coastguard Worker raise PerforceError("error calling " + command) 58*9e94795aSAndroid Build Coastguard Worker 59*9e94795aSAndroid Build Coastguard Worker regex_compiled = re.compile(regex) 60*9e94795aSAndroid Build Coastguard Worker filt_compiled = re.compile(filt) 61*9e94795aSAndroid Build Coastguard Worker 62*9e94795aSAndroid Build Coastguard Worker if len(lines) >= 1: 63*9e94795aSAndroid Build Coastguard Worker lines = filter(filterit, lines) 64*9e94795aSAndroid Build Coastguard Worker if len(lines) >= 1: 65*9e94795aSAndroid Build Coastguard Worker return map(matchit, lines) 66*9e94795aSAndroid Build Coastguard Worker return None 67*9e94795aSAndroid Build Coastguard Worker 68*9e94795aSAndroid Build Coastguard Workertry: 69*9e94795aSAndroid Build Coastguard Worker if len(sys.argv) == 1: 70*9e94795aSAndroid Build Coastguard Worker do_exclude = True 71*9e94795aSAndroid Build Coastguard Worker elif len(sys.argv) == 2 and sys.argv[1] == "-a": 72*9e94795aSAndroid Build Coastguard Worker do_exclude = False 73*9e94795aSAndroid Build Coastguard Worker else: 74*9e94795aSAndroid Build Coastguard Worker print "usage: checktree [-a]" 75*9e94795aSAndroid Build Coastguard Worker print " -a don't filter common crud in the tree" 76*9e94795aSAndroid Build Coastguard Worker sys.exit(1) 77*9e94795aSAndroid Build Coastguard Worker 78*9e94795aSAndroid Build Coastguard Worker have = run("p4 have ...", r'[^#]+#[0-9]+ - (.*)', r'.*') 79*9e94795aSAndroid Build Coastguard Worker 80*9e94795aSAndroid Build Coastguard Worker cwd = os.getcwd() 81*9e94795aSAndroid Build Coastguard Worker files = run("find . -not -type d", r'.(.*)', r'.*') 82*9e94795aSAndroid Build Coastguard Worker files = map(lambda s: cwd+s, files) 83*9e94795aSAndroid Build Coastguard Worker 84*9e94795aSAndroid Build Coastguard Worker added_depot_path = run("p4 opened ...", r'([^#]+)#.*', r'.*?#[0-9]+ - add .*'); 85*9e94795aSAndroid Build Coastguard Worker added = [] 86*9e94795aSAndroid Build Coastguard Worker if added_depot_path: 87*9e94795aSAndroid Build Coastguard Worker added_depot_path = map(quotate, added_depot_path) 88*9e94795aSAndroid Build Coastguard Worker 89*9e94795aSAndroid Build Coastguard Worker where = "p4 where " + " ".join(added_depot_path) 90*9e94795aSAndroid Build Coastguard Worker added = run(where, r'(.*)', r'.*') 91*9e94795aSAndroid Build Coastguard Worker added = map(split_perforce_parts, added) 92*9e94795aSAndroid Build Coastguard Worker 93*9e94795aSAndroid Build Coastguard Worker extras = [] 94*9e94795aSAndroid Build Coastguard Worker 95*9e94795aSAndroid Build Coastguard Worker # Python 2.3 -- still default on Mac OS X -- does not have set() 96*9e94795aSAndroid Build Coastguard Worker # Make dict's here to support the "in" operations below 97*9e94795aSAndroid Build Coastguard Worker have = dict().fromkeys(have, 1) 98*9e94795aSAndroid Build Coastguard Worker added = dict().fromkeys(added, 1) 99*9e94795aSAndroid Build Coastguard Worker 100*9e94795aSAndroid Build Coastguard Worker for file in files: 101*9e94795aSAndroid Build Coastguard Worker if not file in have: 102*9e94795aSAndroid Build Coastguard Worker if not file in added: 103*9e94795aSAndroid Build Coastguard Worker extras.append(file) 104*9e94795aSAndroid Build Coastguard Worker 105*9e94795aSAndroid Build Coastguard Worker if do_exclude: 106*9e94795aSAndroid Build Coastguard Worker extras = filter(filter_excludes, extras) 107*9e94795aSAndroid Build Coastguard Worker 108*9e94795aSAndroid Build Coastguard Worker for s in extras: 109*9e94795aSAndroid Build Coastguard Worker print s.replace(" ", "\\ ") 110*9e94795aSAndroid Build Coastguard Worker 111*9e94795aSAndroid Build Coastguard Workerexcept PerforceError, e: 112*9e94795aSAndroid Build Coastguard Worker sys.exit(2) 113*9e94795aSAndroid Build Coastguard Worker 114