| #!/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) | |