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