configurationengine/source/scripts/conesub_initvariant.py
author m2lahtel
Thu, 21 Oct 2010 16:36:53 +0300
changeset 5 d2c80f5cab53
parent 3 e7e0ae78773e
permissions -rw-r--r--
Updated to version 1.2.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     1
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     3
# All rights reserved.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     4
# This component and the accompanying materials are made available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     6
# which accompanies this distribution, and is available
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     8
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
     9
# Initial Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    11
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    12
# Contributors:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    13
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    14
# Description: 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    15
#
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    16
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    17
import sys
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    18
import logging
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    19
import tempfile
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    20
import os, re
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    21
import shutil
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    22
                          
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    23
from optparse import OptionParser, OptionGroup
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    24
import cone_common
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    25
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    26
from cone.public import api, utils
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    27
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    28
from conesub_merge import merge_config_root_to_config_root,\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    29
                          get_active_root_if_necessary,\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    30
                          MergePolicy, MergeFailedException
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    31
                          
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    32
from conesub_export import run_export
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    33
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    34
VERSION = '1.0'
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    35
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    36
logger    = logging.getLogger('cone')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    37
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    38
class  MetaNotFoundException(Exception):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    39
    pass    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    40
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    41
def find_variant_layers_to_merge(source_config, target_config, find_pattern):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    42
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    43
    Find all layers in the configuration that contain custvariant* in
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    44
    their path name and return a list containing source->target mappings.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    45
    @param source_config: The source configuration object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    46
    @param target_config: The target configuration object.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    47
    @param new_name: The new name to replace custvariant* in the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    48
        target path name with.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    49
    @return: A list of (source_layer, target_layer) tuples.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    50
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    51
    pattern = re.compile(find_pattern)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    52
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    53
    result = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    54
    for src in source_config.list_configurations():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    55
        m = pattern.match(src)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    56
        if m:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    57
            result.append(src)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    58
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    59
    print "Found layers %r" % result
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    60
    return result        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    61
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    62
def main(argv=sys.argv):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    63
    """ Initialize a variant from a cpf. """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    64
    parser = OptionParser(version="%%prog %s" % VERSION)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    65
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    66
    parser.add_options(cone_common.COMMON_OPTIONS)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    67
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    68
    parser.add_option("-p", "--project",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    69
                       dest="project",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    70
                       help="Defines the location of current project. Default is the current working directory.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    71
                       default=".",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    72
                       metavar="STORAGE")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    73
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    74
    group = OptionGroup(parser, 'Initvariant options',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    75
                        'The initvariant action is intended for merging a variant CPF back into the '
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    76
                        'configuration project, or creating a new empty variant based on an existing '
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    77
                        'configuration. It merges all customer variant layers (layers with '
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    78
                        'custvariant* in their path name) and renames them based on the variant ID '
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    79
                        'and variant name ("custvariant_<id>_<name>").')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    80
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    81
    group.add_option("-c", "--configuration",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    82
                        dest="configuration",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    83
                        help="Defines the name of the target configuration. By default the "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    84
                             "configuration file name is composed of product name, variant ID "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    85
                             "and variant name like this: <product>_custvariant_<id>_<name>_root.confml",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    86
                        metavar="CONFIG")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    87
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    88
    group.add_option("-r", "--remote",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    89
                   dest="remote",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    90
                   help="Defines the location of remote storage (CPF)",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    91
                   metavar="STORAGE")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    92
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    93
    group.add_option("-s", "--sourceconfiguration",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    94
                        dest="sourceconfiguration",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    95
                        help="Defines the name of the remote configuration inside the remote storage. "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    96
                             "Default is the active root of the remote project.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    97
                        metavar="CONFIG")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    98
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
    99
    group.add_option("--variant-id", help="Variant ID, mandatory.")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   100
    group.add_option("--variant-name", help="Variant name, optional.")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   101
    group.add_option("--product-name",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   102
                     help="Product name, taken from the configuration data by default "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   103
                          "(i.e. defaults to '${imakerapi.productname}')",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   104
                     default="${imakerapi.productname}")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   105
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   106
    group.add_option("--set-active-root",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   107
                     action="store_true",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   108
                     help="Set the newly created (or update) configuration root as the "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   109
                          "project's active root after the merge is done.")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   110
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   111
    group.add_option("-b","--based-on-configuration",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   112
                     dest="boconfig",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   113
                   help="Defines the configuration root which is used as a base "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   114
                        "configuration for the new empty variant.")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   115
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   116
    group.add_option("--find-layer-regexp",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   117
                     dest="find_pattern",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   118
                     default='.*/manual/.*|.*/configurator/.*',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   119
                     help="Defines the pattern which is used to find the layers "
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   120
                          "from source configuration that will be merged"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   121
                          "Default: '.*/manual/.*|.*/configurator/.*' " )
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   122
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   123
    parser.add_option_group(group)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   124
    (options, _) = parser.parse_args(argv)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   125
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   126
    cone_common.handle_common_options(options)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   127
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   128
    # Check the passed options
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   129
    if not options.remote and not options.boconfig:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   130
        parser.error("Remote project or based-on-configuration must be given")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   131
    if options.remote and options.boconfig:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   132
        parser.error("Only either remote project or based-on-configuration can be given, but not both")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   133
    if not options.variant_id:  parser.error("Variant ID must be given")
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   134
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   135
    temp_cpf_folder = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   136
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   137
    if options.boconfig:   
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   138
        class ExportOptions(object):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   139
            pass
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   140
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   141
        path = ''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   142
        coreplat_name = ''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   143
        product = ''
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   144
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   145
        project = api.Project(api.Storage.open(options.project,"a", username=options.username, password=options.password))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   146
        config = project.get_configuration(options.boconfig)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   147
        meta = config.meta
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   148
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   149
        if meta:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   150
            for prop in meta.array:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   151
                if 'name' in prop.attrs and 'value' in prop.attrs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   152
                    name = prop.attrs['name']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   153
                    if name == 'coreplat_name':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   154
                        coreplat_name =  prop.attrs['value']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   155
                    if name == 'product_name':
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   156
                        product = prop.attrs['value']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   157
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   158
        if not coreplat_name or not product:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   159
            print >>sys.stderr, "Could not find coreplat_name or product_name from meta data."
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   160
            print >>sys.stderr, "Are you sure the given based-on-configuration is valid?"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   161
            sys.exit(2)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   162
        
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   163
        path = coreplat_name + '/' + product
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   164
        
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   165
        # the new way (product)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   166
        if (os.path.exists(os.path.join(options.project, product, "root.confml"))):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   167
            path = product
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   168
        # the old way (coreplat/product)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   169
        elif (os.path.exists(os.path.join(options.project, coreplat_name, product, "root.confml"))):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   170
            path = coreplat_name + '/' + product
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   171
        # any other way, product root somewhere else (?/?/product/root.confml)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   172
        else:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   173
            for root, dirs, files in os.walk(os.path.abspath(options.project)):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   174
                if os.path.exists(os.path.join(root, product, "root.confml")):
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   175
                    fullpath = os.path.abspath(os.path.join(root, product, "root.confml"))
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   176
                    m = re.search(r'%s[\\/](.*)[\\/]root.confml' % re.escape(os.path.abspath(options.project)), fullpath)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   177
                    if m:
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   178
                        path = m.group(1)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   179
                        path = re.sub(r'\\','/', path)
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   180
                    break
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   181
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   182
        temp_cpf_folder = tempfile.mkdtemp()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   183
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   184
        export_options = ExportOptions()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   185
        export_options.project = options.project
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   186
        export_options.remote = os.path.join(temp_cpf_folder, 'temp.cpf')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   187
        export_options.configs = [options.boconfig]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   188
        export_options.username = options.username
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   189
        export_options.password = options.password
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   190
        export_options.config_wildcards = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   191
        export_options.config_regexes   = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   192
        export_options.export_dir = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   193
        export_options.exclude_content_filter = None
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   194
        export_options.include_content_filter = None
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   195
        export_options.added = [path + '/customer/custvariant/manual/root.confml',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   196
                                path + '/customer/custvariant/configurator/root.confml']
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   197
        export_options.exclude_empty_folders = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   198
        export_options.action = None
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   199
                
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   200
        options.remote = export_options.remote
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   201
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   202
        print "Exporting variant CPF to a temporary directory"
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   203
        run_export(export_options)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   204
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   205
    target_project = api.Project(api.Storage.open(options.project,"a", username=options.username, password=options.password))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   206
    source_project = api.Project(api.Storage.open(options.remote,"r", username=options.username, password=options.password))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   207
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   208
    print "Target project: %s" % options.project
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   209
    print "Source project: %s" % options.remote
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   210
    replace_dict = {"VAR_ID": options.variant_id, "VAR_NAME": options.variant_name}    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   211
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   212
    try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   213
        # Open the source configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   214
        source_config = get_active_root_if_necessary(source_project, options.sourceconfiguration, 'source')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   215
        source_config = source_project.get_configuration(source_config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   216
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   217
        # Determine the new name of the layer part (replaces 'custvariant[^/]*')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   218
        if options.variant_name:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   219
            new_name = "custvariant_%s_%s" % (options.variant_id, options.variant_name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   220
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   221
            new_name = "custvariant_%s" % options.variant_id
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   222
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   223
        # Determine the target configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   224
        if options.configuration:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   225
            target_config = options.configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   226
        else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   227
            # Target configuration not given explicitly, automatically
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   228
            # determine the name based on the product name and the new
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   229
            # layer name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   230
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   231
                product_name = utils.expand_refs_by_default_view(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   232
                    options.product_name,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   233
                    source_config.get_default_view(),
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   234
                    catch_not_found = False)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   235
            except Exception, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   236
                print "Could not determine product name: %s" % e
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   237
                sys.exit(2)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   238
            print "Product name:   %s" % product_name
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   239
            target_config = "%s_%s_root.confml" % (product_name, new_name)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   240
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   241
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   242
        def find_layers(source_config, target_config):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   243
            ret_list = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   244
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   245
            layers = find_variant_layers_to_merge(source_config,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   246
                                                target_config,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   247
                                                options.find_pattern)            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   248
            p = re.compile(r'custvariant[^/]*')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   249
            for layer in layers:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   250
                tgt_layer = p.sub(new_name, layer) 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   251
                ret_list.append((layer, tgt_layer))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   252
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   253
            return ret_list
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   254
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   255
        # Perform the merge
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   256
        merge_config_root_to_config_root(
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   257
            source_project      = source_project,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   258
            target_project      = target_project,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   259
            source_config       = options.sourceconfiguration,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   260
            target_config       = target_config,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   261
            layer_finder_func   = find_layers,
5
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   262
            merge_policy        = MergePolicy.OVERWRITE_LAYER,
d2c80f5cab53 Updated to version 1.2.14
m2lahtel
parents: 3
diff changeset
   263
            find_pattern        = options.find_pattern)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   264
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   265
        if options.set_active_root:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   266
            target_project.get_storage().set_active_configuration(target_config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   267
    except MergeFailedException, e:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   268
        print "Could not initialize variant: %s" % e
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   269
        sys.exit(2)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   270
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   271
        # Merge successful, so save the target project
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   272
        # to persist the changes
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   273
        target_project.save()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   274
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   275
    target_project.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   276
    source_project.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   277
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   278
    if temp_cpf_folder:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   279
        logger.debug("Removing temporary CPF directory '%s'" % temp_cpf_folder)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   280
        shutil.rmtree(temp_cpf_folder)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   281
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   282
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   283
if __name__ == "__main__":
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents:
diff changeset
   284
    main()