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