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)
+
