auto import from //depot/cupcake/@135843
diff --git a/core/checktree b/core/checktree
new file mode 100755
index 0000000..b0b9cfa
--- /dev/null
+++ b/core/checktree
@@ -0,0 +1,113 @@
+#!/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)
+