114 lines
2.7 KiB
Plaintext
114 lines
2.7 KiB
Plaintext
|
#!/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)
|
||
|
|