#!/usr/bin/python -E import sys, os, re excludes = [r'.*?/\.obj.*?', r'.*?~', r'.*?\/.DS_Store', r'.*?\/.gdb_history', r'.*?\/buildspec.mk', r'.*?/\..*?\.swp', r'.*?/out/.*?', r'.*?/install/.*?'] excludes_compiled = map(re.compile, excludes) def filter_excludes(str): for e in excludes_compiled: if e.match(str): return False return True def split_perforce_parts(s): spaces = ((s.count(" ") + 1) / 3) * 2 pos = 0 while spaces > 0: pos = s.find(" ", pos) + 1 spaces = spaces - 1 return s[pos:] def quotate(s): return '"' + s + '"' class PerforceError(Exception): def __init__(self,value): self.value = value def __str__(self): return repr(self.value) def run(command, regex, filt): def matchit(s): m = regex_compiled.match(s) if m: return m.group(1) else: return "" def filterit(s): if filt_compiled.match(s): return True else: return False fd = os.popen(command); lines = fd.readlines() status = fd.close() if status: raise PerforceError("error calling " + command) regex_compiled = re.compile(regex) filt_compiled = re.compile(filt) if len(lines) >= 1: lines = filter(filterit, lines) if len(lines) >= 1: return map(matchit, lines) return None try: if len(sys.argv) == 1: do_exclude = True elif len(sys.argv) == 2 and sys.argv[1] == "-a": do_exclude = False else: print "usage: checktree [-a]" print " -a don't filter common crud in the tree" sys.exit(1) have = run("p4 have ...", r'[^#]+#[0-9]+ - (.*)', r'.*') cwd = os.getcwd() files = run("find . -not -type d", r'.(.*)', r'.*') files = map(lambda s: cwd+s, files) added_depot_path = run("p4 opened ...", r'([^#]+)#.*', r'.*?#[0-9]+ - add .*'); added = [] if added_depot_path: added_depot_path = map(quotate, added_depot_path) where = "p4 where " + " ".join(added_depot_path) added = run(where, r'(.*)', r'.*') added = map(split_perforce_parts, added) extras = [] # Python 2.3 -- still default on Mac OS X -- does not have set() # Make dict's here to support the "in" operations below have = dict().fromkeys(have, 1) added = dict().fromkeys(added, 1) for file in files: if not file in have: if not file in added: extras.append(file) if do_exclude: extras = filter(filter_excludes, extras) for s in extras: print s.replace(" ", "\\ ") except PerforceError, e: sys.exit(2)