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