github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/make/core/checktree (about)

     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