buildframework/helium/sf/python/pythoncore/lib/archive/mappers.py
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 587 85df38eb4012
child 645 b8d81fa19e7d
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
#============================================================================ 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
#Name        : mappers.py 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
#Part of     : Helium 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
#All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
#This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
#under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
#which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
#at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
#Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
#Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
#Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
#Description:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
#===============================================================================
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
""" Archive mappers that map how the input files are divided into archives.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    24
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import buildtools
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
import os
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
import codecs
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
import fileutils
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
import logging
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
import symrec
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
import re
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
import csv
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
import shutil
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
_logger = logging.getLogger('logger.mappers')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
_logger.setLevel(logging.INFO)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
# Default value for missing/invalid policy files.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
MISSING_POLICY = "9999"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    41
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
class Mapper(object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
    """ Mapper Abstract class. Any custom implementation must derive it!.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    45
    It handles metadata creation.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
    def __init__(self, config, tool):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
        self._tool = tool
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
        self._config = config
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
        self._metadata = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
        if not os.path.exists(self._config['archives.dir']):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
            os.makedirs(self._config['archives.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
        if self._config.has_key("grace.metadata") and self._config.get_boolean("grace.metadata", False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
            if self._config.has_key("grace.template") and os.path.exists(self._config["grace.template"]) and \
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
             not os.path.exists(os.path.join(self._config['archives.dir'], self._config['name'] + ".metadata.xml")):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
                shutil.copy(config["grace.template"], os.path.join(self._config['archives.dir'], self._config['name'] + ".metadata.xml"))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
            self._metadata = symrec.ReleaseMetadata(os.path.join(self._config['archives.dir'], self._config['name']+ ".metadata.xml"),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
                                       service=self._config['grace.service'],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
                                       product=self._config['grace.product'],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
                                       release=self._config['grace.release'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
            self._metadata.save()            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
    def declare_package(self, filename, extract="single"):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
        """ Add a package to the metadata file. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
        if self._metadata is None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
            return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
        self._metadata.add_package(os.path.basename(filename), extract=extract, filters=self._config.get_list('grace.filters', None), default=self._config.get_boolean('grace.default', True))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
        self._metadata.save()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
    def create_commands(self, manifest):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
        """ Return a list of command list. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
        return [[self._tool.create_command(self._config['name'], manifests=[manifest])]]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
class DefaultMapper(Mapper):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
    """ The default mapper. It splits the content based on size characteristics.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
    'the max.files.per.archive' and 'max.uncompressed.size' properties define how the input files
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
    are split between a number of part zips.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
    def __init__(self, config, archiver):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
        """ Initialization. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
        Mapper.__init__(self, config, archiver)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
    def create_commands(self, manifest):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
        """ Return a list of command lists. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    88
        result = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
        _logger.info("  * Input manifest: " + manifest)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
        manifests = self._split_manifest_file(self._config['name'], manifest)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
        if not os.path.exists(self._config['archives.dir']):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
            _logger.info("  * Mkdir " + self._config['archives.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
            os.makedirs(self._config['archives.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
        for manifest in manifests:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
            _logger.info("  * Creating command for manifest: " + manifest)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
            filename = os.path.join(self._config['archives.dir'], os.path.splitext(os.path.basename(manifest))[0])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
            if len(manifests) == 1:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
                filename = os.path.join(self._config['archives.dir'], self._config['name'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
            _logger.info("  * " + filename + self._tool.extension())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   102
            self.declare_package(filename + self._tool.extension(), self._config.get('grace.extract', 'single'))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
            result.extend(self._tool.create_command(self._config.get('zip.root.dir', self._config['root.dir']), filename, manifests=[manifest]))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
        return [result]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
    def _split_manifest_file(self, name, manifest_file_path):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
        """ This method return a list of files that contain the content of the zip parts to create. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
        filenames = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
        if (self._config.has_key('max.files.per.archive') or self._config.has_key('max.uncompressed.size')):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
            size = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
            files = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
            part = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
            filename = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
            output = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
                        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
            if os.path.exists(self._config['root.dir']) and os.path.isdir(self._config['root.dir']):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
                curdir = os.path.abspath(os.curdir)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
                os.chdir(self._config.get('zip.root.dir', self._config['root.dir']))            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
                maxfiles = self._config.get('max.files.per.archive', 100000000)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
                _logger.info("Max number of files per archive: " + str(maxfiles))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
                max_uncompressed_size = self._config.get('max.uncompressed.size', 100000000)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
                _logger.info("Max uncompressed size per archive: " + str(max_uncompressed_size))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
                file_handle = codecs.open(manifest_file_path, "r", "utf-8" )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
                for line in file_handle.readlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
                    line = line.rstrip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
                    if(os.path.isfile(line)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   132
                        if part == 0 or files == int(maxfiles) or size + os.path.getsize(line) >= int(max_uncompressed_size):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
                            if output != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   134
                                output.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   135
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   136
                            size = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   137
                            files = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   138
                            part += 1
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   139
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   140
                            filename = "%s_part%02d" % (name, part)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   141
                            filenames.append(os.path.join(self._config['temp.build.dir'], filename + ".txt"))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   142
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   143
                            output = codecs.open(os.path.join(self._config['temp.build.dir'], filename + ".txt"), 'w', "utf-8" )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   144
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   145
                        files += 1
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   146
                        size += os.path.getsize(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   147
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   148
                        output.write(u"".join([line, u'\n']))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   149
                    elif(os.path.isdir(line)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   150
                        if (len(os.listdir(line)) == 0):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   151
                            if part == 0 or files == int(maxfiles):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   152
                                if output != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   153
                                    output.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   154
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   155
                                size = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   156
                                files = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   157
                                part += 1
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   158
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   159
                                filename = "%s_part%02d" % (name, part)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   160
                                filenames.append(os.path.join(self._config['temp.build.dir'], filename + ".txt"))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   161
                                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   162
                                output = open(os.path.abspath(os.path.join(self._config['temp.build.dir'], filename + ".txt")), 'w')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   163
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   164
                            files += 1
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   165
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   166
                            output.write(u"".join([line, u'\n']))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   167
                    else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   168
                        _logger.warning('Not recognized as file or directory: %s' % line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   169
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   170
                if output != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   171
                    output.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   172
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   173
                file_handle.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   174
                os.chdir(curdir)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   175
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   176
            filenames.append(manifest_file_path)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   177
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   178
        return filenames
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   179
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   180
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   181
class PolicyMapper(Mapper):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   182
    """ Implements a policy content mapper.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   183
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   184
    It transforms a list of files into a list of commands with their inputs.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   185
    All files with policy 0 will be under the main archive.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   186
    All other files will get backed up by policy and then store into an second archive. 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   187
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   188
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   189
    def __init__(self, config, archiver):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   190
        """ Initialization. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   191
        Mapper.__init__(self, config, archiver)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   192
        self._policies = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   193
        self._policy_cache = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   194
        self._binary = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   195
        # Load csv
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   196
        if self._config.has_key('policy.csv'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   197
            if os.path.exists(self._config['policy.csv']):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   198
                self.load_policy_binary(self._config['policy.csv'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   199
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   200
                _logger.error("POLICY_ERROR: File not found '%s'." % self._config['policy.csv'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   201
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   202
    def load_policy_binary(self, csvfile, column=1):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   203
        """ Loads the binary IDs from the CSV file. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   204
        _logger.info("POLICY_INFO: Loading policy definition '%s'." % csvfile)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   205
        reader = csv.reader(open(csvfile, "rU"))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   206
        for row in reader:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   207
            if re.match(r"^((?:\d+)|(?:0842[0-9a-zA-Z]{3}))$", row[0].strip()):                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   208
                _logger.info("POLICY_INFO: Adding policy: '%s' => '%s'" % (row[0].strip(), row[column].strip().lower()))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   209
                self._binary[row[0].strip()] = row[column].strip().lower()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   210
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   211
                _logger.warning("POLICY_WARNING: Discarding policy: '%s'." % row[0].strip())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   212
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   213
    def zip2zip(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   214
        """ Should the non public zip be zipped up under a specific zip. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   215
        return self._config.get_boolean('policy.zip2zip', False)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   216
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   217
    def create_commands(self, manifest):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   218
        """ Generates a list of build commands. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   219
        result = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   220
        stages = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   221
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   222
        # Create the archive output directory
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   223
        if not os.path.exists(self._config['archives.dir']):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   224
            _logger.info("  * Mkdir " + self._config['archives.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   225
            os.makedirs(self._config['archives.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   226
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   227
        # Sort the manifest content, splitting it by policy
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   228
        file_handle = codecs.open(manifest, "r", "utf-8")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   229
        for line in file_handle.readlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   230
            line = line.rstrip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   231
            self._sort_by_policy(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   232
        file_handle.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   233
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   234
        # Generating sublists.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   235
        for key in self._policies.keys():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   236
            self._policies[key].close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   237
            manifest = os.path.join(self._config['temp.build.dir'], self._config['name'] + "_%s" % key + ".txt")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   238
            filename = os.path.join(self._config['archives.dir'], self._config['name'] + "_%s" % key)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   239
            _logger.info("  * " + filename + self._tool.extension())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   240
            result.extend(self._tool.create_command(self._config.get('zip.root.dir', self._config['root.dir']), filename, manifests=[manifest]))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   241
        stages.append(result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   242
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   243
        # See if any internal archives need to be created
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   244
        content = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   245
        for key in self._policies.keys():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   246
            if not self.zip2zip():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   247
                self.declare_package(self._config['name'] + "_%s" % key + self._tool.extension())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   248
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   249
                if key != "0":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   250
                    content.append(os.path.join(self._config['archives.dir'], self._config['name'] + "_%s" % key + self._tool.extension()))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   251
                else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   252
                    self.declare_package(self._config['name'] + "_%s" % key + self._tool.extension())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   253
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   254
        # Creating zip that contains each policy zips.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   255
        if self.zip2zip() and len(content) > 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   256
            manifest = os.path.join(self._config['temp.build.dir'], self._config['name'] +  ".internal.txt")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   257
            file_handle = codecs.open( manifest, "w+", "utf-8" )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   258
            file_handle.write(u"\n".join(content))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   259
            file_handle.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   260
            internal = "internal"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   261
            if self._config.has_key('policy.internal.name'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   262
                internal = self._config['policy.internal.name']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   263
            filename = os.path.join(self._config['archives.dir'], self._config['name'] +  "_" + internal)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   264
            _logger.info("  * " + filename + self._tool.extension())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   265
            self.declare_package(filename + self._tool.extension(), "double")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   266
            stages.append(self._tool.create_command(self._config['archives.dir'], filename, manifests=[manifest]))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   267
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   268
            cmds = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   269
            for filename in content:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   270
                cmds.append(buildtools.Delete(filename=filename))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   271
            stages.append(cmds)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   272
        return stages
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   273
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   274
    def get_dir_policy(self, dirname):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   275
        """ Get policy value for a specific directory. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   276
        dirname = os.path.normpath(dirname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   277
        if not self._policy_cache.has_key(dirname):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   278
            policyfile = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   279
            for name in self.get_policy_filenames():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   280
                if os.sep != '\\':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   281
                    for filename in os.listdir(dirname):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   282
                        if filename.lower() == name.lower():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   283
                            policyfile = os.path.join(dirname, filename)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   284
                            break
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   285
                elif os.path.exists(os.path.join(dirname, name)): 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   286
                    policyfile = os.path.join(dirname, name)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   287
                    break
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   288
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   289
            value = self._config.get('policy.default.value', MISSING_POLICY)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   290
            if policyfile != None:      #policy file present
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   291
                try:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   292
                    value = fileutils.read_policy_content(policyfile)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   293
                    if value not in self._binary.keys():    #check policy file is valid
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   294
                        _logger.error("POLICY_ERROR: policy file found %s but policy %s value not exists in csv" % (policyfile, value))
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   295
                except IOError, exc:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   296
                    _logger.error("POLICY_ERROR: %s" % exc)         
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   297
                    value = self._config.get('policy.default.value', MISSING_POLICY)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   298
            else:       #no policy file present
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   299
                filePresent = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   300
                dirPresent = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   301
                for ftype in os.listdir(dirname):   #see if files or directories are present
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   302
                    if os.path.isdir(os.path.join(dirname, ftype)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   303
                        dirPresent = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   304
                    if os.path.isfile(os.path.join(dirname, ftype)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   305
                        filePresent = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   306
                        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   307
                if filePresent:    #files present : error     
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   308
                    _logger.error("POLICY_ERROR: could not find a policy file under: '%s'" % dirname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   309
                elif dirPresent and not filePresent:  #directories only : warning
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   310
                    _logger.error("POLICY_WARNING: no policy file, no files present, but sub-folder present in : '%s'" % dirname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   311
                else:       #no files no dirs : warning
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   312
                    _logger.error("POLICY_WARNING: empty directory at : '%s'" % dirname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   313
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   314
            # saving the policy value for that directory.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   315
            self._policy_cache[dirname] = value
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   316
        return self._policy_cache[dirname]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   317
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   318
    def get_policy_filenames(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   319
        """ Returns the list of potential policy filenames. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   320
        return self._config.get_list('policy.filenames', ['Distribution.policy.s60'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   321
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   322
    def _sort_by_policy(self, filename):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   323
        """ Store the input file sorted by its policy number. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   324
        path = os.path.join(self._config['root.dir'], filename)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   325
        parentdir = os.path.dirname(path)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   326
        if os.path.isdir(path):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   327
            parentdir = path
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   328
        value = self.get_dir_policy(parentdir)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   329
        if not value in self._policies:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   330
            self._policies[value] = codecs.open( os.path.join(self._config['temp.build.dir'], self._config['name'] + "_%s" % value + ".txt"), "w+", "utf-8" )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   331
        self._policies[value].write(u"%s\n" % filename)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   332
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   333
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   334
class PolicyRemoverMapper(PolicyMapper):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   335
    """ This class implements a variant of the policy mapper.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   336
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   337
    It removes the internal source. Only binary flagged content is kept.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   338
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   339
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   340
    def __init__(self, config, archiver):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   341
        """ Initialization. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   342
        PolicyMapper.__init__(self, config, archiver)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   343
        self._rm_policy_cache = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   344
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   345
    def get_policy_root_dir(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   346
        """ Return the policy.root.dir or root.dir if not set or not under root.dir."""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   347
        if not self._config.has_key("policy.root.dir"):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   348
            return os.path.normpath(self._config['root.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   349
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   350
            if fileutils.destinsrc(self._config['root.dir'], self._config['policy.root.dir']):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   351
                return os.path.normpath(self._config['policy.root.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   352
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   353
                return os.path.normpath(self._config['root.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   354
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   355
    def get_rmdir_policy(self, dirname):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   356
        """ check if the directory should be dropped or not"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   357
        dirname = os.path.normpath(dirname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   358
        # check if parent is banned...
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   359
        prootdir = os.path.normpath(self.get_policy_root_dir())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   360
        rootdir = os.path.normpath(self._config['root.dir'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   361
        if os.sep == '\\':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   362
            dirname = dirname.lower()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   363
            prootdir = prootdir.lower()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   364
            rootdir = rootdir.lower()        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   365
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   366
        # else get real value...
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   367
        if not self._rm_policy_cache.has_key(dirname):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   368
            self._rm_policy_cache[dirname] = self.get_dir_policy(dirname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   369
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   370
        return self._rm_policy_cache[dirname]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   371
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   372
    def create_commands(self, manifest):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   373
        """ Generates a list of build commands. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   374
        stages = PolicyMapper.create_commands(self, manifest)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   375
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   376
        if not self._config.has_key('policy.csv'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   377
            _logger.error("POLICY_ERROR: Property 'policy.csv' not defined everything will get removed.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   378
        cmds = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   379
        file_handle = codecs.open( manifest, "r", "utf-8" )
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   380
        for line in file_handle.readlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   381
            line = line.rstrip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   382
            filepath = os.path.normpath(os.path.join(self._config.get('zip.root.dir', self._config['root.dir']), line))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   383
            value = self.get_rmdir_policy(os.path.dirname(filepath))            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   384
            delete = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   385
            if value in self._binary.keys():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   386
                if self._binary[value] == "yes":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   387
                    _logger.info("POLICY_INFO: Keeping %s (%s=>yes)!" % (filepath, value))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   388
                    delete = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   389
                elif self._binary[value] == "bin":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   390
                    _logger.info("POLICY_INFO: Keeping %s (%s=>bin)!" % (filepath, value))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   391
                    delete = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   392
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   393
                _logger.error("POLICY_ERROR: %s value for %s not in csv file. Will be removed!!" % (value, filepath))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   394
               
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   395
            if delete:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   396
                _logger.info("POLICY_INFO: File %s will be removed!" % filepath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   397
                cmds.append(buildtools.Delete(filename=filepath))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   398
        file_handle.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   399
        if len(cmds) > 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   400
            stages.append(cmds)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   401
        return stages
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   402
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   403
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   404
class SFPolicyRemoverMapper(PolicyRemoverMapper):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   405
    """ Implement an SFL column based policy remover. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   406
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   407
    def __init__(self, config, archiver):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   408
        """ Initialization. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   409
        PolicyRemoverMapper.__init__(self, config, archiver)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   410
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   411
    def load_policy_binary(self, csvfile, column=1):
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   412
        """ Loading the policy using the 3rd column. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   413
        _logger.info("POLICY_INFO: Loading actions from the 3rd column")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   414
        PolicyRemoverMapper.load_policy_binary(self, csvfile, column=3)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   415
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   416
class EPLPolicyRemoverMapper(PolicyRemoverMapper):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   417
    """ Implement an EPL column based policy remover. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   418
    def __init__(self, config, archiver):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   419
        """ Initialization. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   420
        PolicyRemoverMapper.__init__(self, config, archiver)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   421
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   422
    def load_policy_binary(self, csvfile, column=1):
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   423
        """ Loading the policy using the 4th column. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   424
        _logger.info("POLICY_INFO: Loading actions from the 4th column")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   425
        PolicyRemoverMapper.load_policy_binary(self, csvfile, column=4)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   426
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   427
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   428
MAPPERS = {'default': DefaultMapper,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   429
             'policy': PolicyMapper,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   430
             'policy.remover': PolicyRemoverMapper,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   431
             'sfl.policy.remover': SFPolicyRemoverMapper,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   432
             'epl.policy.remover': EPLPolicyRemoverMapper,}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   433
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   434
def get_mapper(name, config, archiver):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   435
    """ Get mapper instance from its string id. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   436
    if name in MAPPERS:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   437
        return MAPPERS[name](config, archiver)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   438
    raise Exception("ERROR: Could not find mapper '%s'." % name)