Package archive :: Module scanners |
[hide private]
[frames] | no frames]

# Source Code for Module archive.scanners

      1  #============================================================================
      2  #Name        : scanners.py
      3  #Part of     : Helium
      4
      5  #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
      6  #All rights reserved.
      7  #This component and the accompanying materials are made available
      8  #under the terms of the License "Eclipse Public License v1.0"
      9  #which accompanies this distribution, and is available
     10  #at the URL "http://www.eclipse.org/legal/epl-v10.html".
     11  #
     12  #Initial Contributors:
     13  #Nokia Corporation - initial contribution.
     14  #
     15  #Contributors:
     16  #
     17  #Description:
     18  #===============================================================================
     19
     20  """ Implementation of the available scanner for """
     21
     22  import os
     23  import fileutils
     24  import selectors
     25  import logging
     26  import codecs
     27  import pathaddition
     28
     29  logger = logging.getLogger('archive.scanners')
     30  logger_abld = logging.getLogger('archive.scanners.abld')
     31  logging.basicConfig()
     32  #logger_abld.setLevel(logging.DEBUG)
     33
     34 -class Scanner(fileutils.AbstractScanner):
     35      """ Abstract class that represent and input source. """
     36
     37 -    def __init__(self, config):
     38          fileutils.AbstractScanner.__init__(self)
     39          self._config = config
     40          self.setup()
     41
     42 -    def setup(self):
     43          """ Setting up the scanner. """
     44          [self.add_include(inc) for inc in self._config.get_list('include', [])]
     45          [self.add_exclude(ex) for ex in self._config.get_list('exclude', [])]
     46          [self.add_exclude_file(ex) for ex in self._config.get_list('exclude_file', [])]
     47          [self.add_exclude_lst(filename) for filename in self._config.get_list('exclude.lst', [])]
     48          [self.add_filetype(filetype) for filetype in self._config.get_list('filetype', [])]
     49          [self.add_selector(selectors.get_selector(selector, self._config)) for selector in self._config.get_list('selector', [])]
     50          # To support old features.
     51          # TODO: inform customers and remove.
     52          if 'distribution.policy.s60' in self._config:
     53              self.add_selector(selectors.get_selector('distribution.policy.s60', self._config))
     54
     55 -    def add_exclude_lst(self, filename):
     56          """ Adding excludes from exclude list. """
     57          if not os.path.exists(filename):
     58              raise Exception("Could not find '%s'." % filename)
     59          root_dir = os.path.normpath(self._config['root.dir'])
     60          flh = codecs.open(filename, 'r', 'utf-8')
     61          for line in flh:
     62              path = os.path.normpath(line.strip())
     63              if os.path.splitdrive(root_dir)[0] != "":
     64                  path = os.path.join(os.path.splitdrive(root_dir)[0], path)
     65              if fileutils.destinsrc(root_dir, path):
     66                  pathrel = pathaddition.relative.abs2rel(path, root_dir)
     67                  logger.debug("pathrel: %s" % (pathrel))
     68                  self.add_exclude(pathrel)
     69              else:
     70                  logger.warning("path '%s' is not under '%s', ignoring." % (path, root_dir))
     71          flh.close()
     72
     73 -    def scan(self):
     74          """ Generator method that scan the relevant input source.
     75              This method need to be overloaded by the specialized class.
     76              return fullpath name
     77          """
     78          raise  NotImplementedError()
     79
     80
     81 -class AbldWhatScanner(Scanner):
     82      """ Scanning the filesystem. """
     83
     84 -    def __init__(self, config):
     85          Scanner.__init__(self, config)
     86          self.root_dir = unicode(os.path.normpath(self._config['root.dir']))
     87
     88 -    def scan(self):
     89          """
     90              Abld what commands.
     91              include property have not effect on the selection mechanism.
     92          """
     93          os.environ["SYMBIANBUILD_DEPENDENCYOFF"] = "1"
     94          for path in self._config.get_list('abld.exportpath', []):
     95              logger_abld.debug("abld.exportpath: %s" % path)
     96              if os.path.exists(os.path.join(self.root_dir, path, 'bld.inf')):
     97                  os.chdir(os.path.join(self.root_dir, path))
     98                  os.popen('bldmake bldfiles -k')
     99                  for result in self._scan_abld_what("abld export -what -k"):
    100                      yield result
    101
    102          for path in self._config.get_list('abld.buildpath', []):
    103              logger_abld.debug("abld.buildpath: %s" % path)
    104              if os.path.exists(os.path.join(self.root_dir, path, 'bld.inf')):
    105                  for type_ in self._config.get_list('abld.type', ['armv5']):
    106                      os.environ["EPOCROOT"] = self._config.get('abld.epocroot','\\')
    107                      os.environ["PATH"] = os.environ["EPOCROOT"] + "epoc32\\tools;" + os.environ["EPOCROOT"] + "epoc32\\gcc\\bin;" + os.environ["PATH"]
    108                      logger_abld.debug("abld.type: %s" % type_)
    109                      os.chdir(os.path.join(self.root_dir, path))
    110                      os.popen("bldmake bldfiles -k")
    111                      os.popen("abld makefile %s -k" % type_)
    112                      for result in self._scan_abld_what("abld build -what %s" % type_):
    113                          yield result
    114
    115 -    def _run_cmd(self, cmd):
    116          """ Run command."""
    117          logger_abld.debug("command: %s" % cmd)
    118          process = os.popen(cmd)
    119          abld_output = process.read()
    120          err = process.close()
    121          return (err, abld_output)
    122
    123 -    def _scan_abld_what(self, cmd):
    124          """ Abld what output parser."""
    125          (err, abld_output) = self._run_cmd(cmd)
    126          logger_abld.debug("abld_output: %s" % abld_output)
    127          for what_path in abld_output.split("\n"):
    128              what_path = what_path.strip()
    129              if (what_path.startswith('\\') or what_path.startswith('/')) and self.is_filetype(what_path) \
    130                  and not self.is_excluded(what_path) and self.is_selected(what_path):
    131                  if os.path.exists(what_path):
    132                      logger_abld.debug("adding: %s" % what_path)
    133                      yield what_path
    134                  else:
    135                      logger.error("Could not find '%s'." % what_path)
    136
    137
    138 -class FileSystemScanner(fileutils.FileScanner, Scanner):
    139      """ Scanning the filesystem. """
    140
    141 -    def __init__(self, config):
    142          fileutils.FileScanner.__init__(self, unicode(os.path.normpath(config['root.dir'])))
    143          Scanner.__init__(self, config)
    144
    145 -    def scan(self):
    146          """
    147              Implement the scanning of the filesystem.
    148              Actually delegate scanning of a directory to Filescanner.
    149          """
    150          for path in fileutils.FileScanner.scan(self):
    151              yield path
    152
    153
    154 -class InputFileScanner(fileutils.FileScanner, Scanner):
    155      """ Scanning the filesystem. """
    156
    157 -    def __init__(self, config):
    158          """ Initialisation. """
    159          fileutils.FileScanner.__init__(self, unicode(os.path.normpath(config['root.dir'])))
    160          Scanner.__init__(self, config)
    161
    162 -    def scan(self):
    163          """
    164          ::
    165
    166              <set name="scanners" value="input.file"/>
    167              <set name="root.dir" value="${build.drive}"/>
    168              <set name="input.files" value="file1.lst,file2.lst,file3.lst"/>
    169              <set name="exclude" value="epoc32/**/*.dll"/>
    170          """
    171          for input_file in self._config.get_list('input.files', []):
    172              logger.info("Include content from: %s" % input_file)
    173              handle = open(input_file, "r")
    174              for line in handle.readlines():
    175                  path = os.path.join(self._config['root.dir'], line.strip())
    176                  if os.path.exists(path):
    177                      if self.is_filetype(path) \
    178                          and not self.is_excluded(path) and self.is_selected(path):
    179                          yield path
    180                  else:
    181                      logger.info("File not found: %s" % path)
    182              handle.close()
    183
    184  __scanners = {'default': FileSystemScanner,
    185                'input.file': InputFileScanner,
    186                'abld.what': AbldWhatScanner,
    187                }
    188
    189 -def get_scanners(names, config):
    190      result = []
    191      for name in names:
    192          if name in __scanners:
    193              result.append(__scanners[name](config))
    194          else:
    195              raise Exception("ERROR: Could not find scanner '%s'." % name)
    196      return result
    197