configurationengine/source/scripts/conesub_generate.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    17
import os, re, fnmatch
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
import logging
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
from optparse import OptionParser, OptionGroup
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
import cone_common
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
import time
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    22
from distutils.dir_util import mkpath, DistutilsFileError
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
from cone.public import api, plugin, utils, exceptions
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    24
from cone.report import generation_report
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    25
from cone.confml import persistentconfml
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
VERSION = '1.0'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    30
log = logging.getLogger('cone')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    32
def main():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    33
    """ Generate a configuration. """
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
    parser = OptionParser(version="%%prog %s" % VERSION)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    parser.add_options(cone_common.COMMON_OPTIONS)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
    parser.add_option("-c", "--configuration",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
                        dest="configuration",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
                        help="defines the name of the configuration for the action",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    41
                        metavar="CONFIG")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    42
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    43
    parser.add_option("-p", "--project",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    44
                       dest="project",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
                       help="defines the location of current project. Default is the current working directory.",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
                       default=".",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
                       metavar="STORAGE")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
    gen_group = OptionGroup(parser, 'Generate options',
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
                    'The generate function will create target files from a specific configuration.'\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
                    'The generate will always work with read-only mode of the project, so no changes are saved to project')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
  
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
    gen_group.add_option("-o", "--output",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
                   dest="output",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
                   help="defines the target folder where the files are is generated or copied",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
                   metavar="FOLDER",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
                   default="output")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
    gen_group.add_option("-i", "--impl",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
                   dest="impls",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
                   action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
                   help=\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
"""Define a Python regular expression filter for actual ImplML plugin(s) that needs to be executed. The whole path to ImplML filename is used in the regexp matching.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
The impl operation can be used several times in a single command.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
                                                                        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
Example1 --impl crml => matches for any ImplML file that has a CrML string in the path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
Example2 --impl makeml$ => matches for ImplML file that has ends with MakeML string.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
""",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
                   metavar="IMPLS",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    gen_group.add_option("--impl-tag",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
                   dest="tags",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
                   action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
                   help="define a tag for the implementations that are included to the output. "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
                        "A tag is name value pair and has the following format: name:value, e.g. target:rofs3."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
                        "Example --impl-tag=target:uda --impl-tag=target:content, which would include impls include both tags.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
                   metavar="TAG",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
    gen_group.add_option("--impl-tag-policy",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
                   dest="tags_policy",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
                   action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
                   help="Policy for implementation tags. May have one of the following values: --impl-tag-policy=AND, --impl-tag-policy=OR. "\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
                   "Default is OR.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
                   metavar="TAGS_POLICY",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
    gen_group.add_option("-s", "--set",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
                   dest="overrides",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
                   action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
                   help="Override a ConfML reference in the execution."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
                        "The set operation can be used several times in a single command."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
                        "Example -s foo.bar=10 -s foo.fea='test'.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
                   metavar="SET",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
    gen_group.add_option("--add",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
                   dest="added",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
                   action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
                   help="Add a given configuration to the given configuration as last element."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
                        "The add operation can be used several times in a single command."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
                        "Example --add foo/root.confml --add bar/root-confml.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
                   metavar="CONF",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
    gen_group.add_option("-r", "--report",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
                   dest="report",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
                   action="store",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
                   help="Generates a report about settings that are properly generated."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
                        "Example -r report.html.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
                   metavar="FILE",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   120
    gen_group.add_option("--report-option",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   121
                   action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   122
                   help="Specifies the report verbose options, that defines "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   123
                        "what data is included to the report. The option can be "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   124
                        "used multiple times."\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   125
                        "choises=[default|all]"\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   126
                        "Example --report-option=all",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   127
                   metavar="OPTION",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   128
                   default=[])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   129
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
    gen_group.add_option("-t", "--template",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
                   dest="template",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
                   action="store",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
                   help="Template used in report generation."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
                        "Example -t report_template.html.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
                   metavar="FILE",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
    gen_group.add_option("--report-data-output",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
                   help="Specifies a file where intermediary report data is generated.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
                   metavar="FILE",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
                   default=None)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
    gen_group.add_option("-n", "--dryrun",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
                   dest="dryrun",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
                   action="store_true",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
                   help="Executes generation without generation output.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
                   default=False)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
    gen_group.add_option("--add-setting-file",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
                   dest="settings",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
                   action="append",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
                   type="string",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
                   help="Generate specific settings in ini format."\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
                        "Example -o my_generate_settings.cfg.",
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
                   metavar="FILE",\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
                   default=None)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   159
    gen_group.add_option("--dump-autodata",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   160
                   dest="dump_autodata",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   161
                   action="store",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   162
                   type="string",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   163
                   metavar="FILE",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   164
                   help="Specifies a confml file for storing autodata.confml permanently.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   165
                   default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   166
    gen_group.add_option("-w", "--what",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   167
                   dest="what",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   168
                   action="store",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
                   type="string",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
                   metavar="FILE",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   171
                   help="List output files to a txt file",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   172
                   default=None)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   174
    lf_group = OptionGroup(parser, 'Layer filtering options',
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   175
                    'Layer filtering options define configuration layers to be used for filtering '\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   176
                    'the implementations that are used to generate output. Filtering by a layer means that '\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   177
                    'only implementations that generate their output based on settings changed on that layer '\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   178
                    'are included in the generation.')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   179
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   180
    lf_group.add_option("-l", "--layer",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   181
                   dest="layers",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   182
                   type="int",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   183
                   action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   184
                   help="Define a layer by giving its index in the root configuration. "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   185
                        "0 is first, 1 the second, -1 the last, -2 the second to last and so on. "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   186
                        "The layer operation can be used several times in a single command. "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   187
                        "Example -l -1 --layer=-2, which would append a layers -1 and -2 to the layers => layers = -1,-2",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   188
                   metavar="LAYER",\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   189
                   default=None)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   190
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   191
    lf_group.add_option("--layer-regex",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   192
                   dest="layer_regexes",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   193
                   action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   194
                   help="Define a regular expression for including layers into the generation process, "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   195
                        "e.g. --layer-regex layer[0-9]/root.confml. The pattern is matched against the layer root "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   196
                        "path, which could be e.g. 'assets/layer1/root.confml'.",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   197
                   metavar="REGEX",)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   198
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   199
    lf_group.add_option("--layer-wildcard",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   200
                   dest="layer_wildcards",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   201
                   action="append",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   202
                   help="Define a wildcard for including layers into the generation process, e.g "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   203
                        "--layer-wildcard layer*",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   204
                   metavar="WILDCARD",)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   205
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   206
    lf_group.add_option("--all-layers",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   207
                   dest="all_layers",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   208
                   action="store_true",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   209
                   help="Include all layers in generation. This switch overrides all other layer "\
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   210
                        "configurations (iMaker API and using the --layer, --layer-regex and --layer-wildcard parameters)",
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   211
                   default=False)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   212
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
    start_time = time.time()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   215
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   216
    parser.add_option_group(gen_group)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   217
    parser.add_option_group(lf_group)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   218
    (options, _) = parser.parse_args()
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
    settinglist = [os.path.join(ROOT_PATH,'conesub_generate.cfg')]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
    if options.settings:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
        for setting_file in options.settings:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
            settinglist.append(os.path.normpath(os.path.join(ROOT_PATH, setting_file)))            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   224
    gset = cone_common.get_settings(settinglist)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
    cone_common.handle_common_options(options, settings=gset)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
          
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
    current = api.Project(api.Storage.open(options.project,"r"))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
    active_root = current.get_storage().get_active_configuration()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
    if not options.configuration:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   231
        if active_root == "":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   232
            parser.error("configuration must be given")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   233
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
            logging.getLogger('cone').info('No configuration given! Using active root configuration %s' % active_root)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
            options.configuration = active_root
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
    try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        config  = current.get_configuration(options.configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
    except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        parser.error("No such configuration: %s" % options.configuration)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
    reffilters = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
    implfilters = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
    impltags = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
    # Include possible additional configurations
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
    if options.added:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
        for configname in options.added:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
            logging.getLogger('cone').info('Adding configuration %s' % configname) 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
            config.include_configuration(utils.resourceref.norm(configname))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   250
    # Get implementation filters from configuration
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   251
    try:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   252
        implfilters = (config.get_default_view().get_feature('imakerapi.cone_impls').get_value() or '').split(',')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   253
    except exceptions.NotFound:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   254
        implfilters = []
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   255
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
    # Get filters from command line if they exist => cmd overrides configuration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
    if options.impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        implfilters = options.impls
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
    if options.tags and len(options.tags) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        impltags = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        for tag in options.tags:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
            (name,value) = tag.split(':',2)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
            existingvalue = impltags.get(name,[])
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
            existingvalue.append(value)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
            impltags[name] = existingvalue
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        logging.getLogger('cone').info('Tag filter %s' % impltags)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
    else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        impltags = None
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
    tags_policy = 'OR'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
    if options.tags_policy:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
        tags_policy = options.tags_policy[0]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   274
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   275
    layerdefs = _get_included_layers(config, options, parser)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   276
    filter_by_refs = _filter_by_refs(config, options, parser)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   278
    if layerdefs:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   279
        logging.getLogger('cone').info('Included layers:\n%s' % '\n'.join(layerdefs))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   280
    else:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   281
        logging.getLogger('cone').info('Including all layers')
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   283
    dview = config.get_default_view()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   284
    # Add data references if included layers are defined
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
    if len(layerdefs) > 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
        # get the data references from given layers
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
        logging.getLogger('cone').info('Getting layer specific data reference from %s' % layerdefs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
        reffilters = []
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   289
        for layer_path in utils.distinct_array(layerdefs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   290
            logging.getLogger('cone').info('Searching layer %s' % layer_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   291
            layer = config.get_configuration(layer_path)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
            refs = _get_new_refs(reffilters, layer.list_leaf_datas())
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   293
            # reduce the refs of sequences to single reference of the sequence feature
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   294
            layerrefs = set() 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   295
            for fea in dview.get_features(refs):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   296
                layerrefs.add(fea.fqr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   297
                if fea.is_sequence():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   298
                    layerrefs.add(fea.get_sequence_parent().fqr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   299
            
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   300
            refs = sorted(list(layerrefs))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   301
            #logging.getLogger('cone').info("Refs from layer '%s'\n%s" % (layer.get_path(), '\n'.join(refs)))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
            reffilters += refs
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   303
          
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
    # Make sure that the output folder exists
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
    if not os.path.exists(options.output):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        os.makedirs(options.output)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   307
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
    impls = plugin.filtered_impl_set(config,implfilters)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
    impls.output = options.output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   311
    log.info("Parsed %s implementation(s)" % len(impls))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   312
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
    logging.getLogger('cone').info("Supported implementation file extensions: %r" % plugin.get_supported_file_extensions())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
#    logging.getLogger('cone').debug('Loaded implementations:')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
#    for impl in impls:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
#        msg = "File '%s', impl. type '%s', class '%s', phase '%s'" % \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
#              (impl.ref, impl.IMPL_TYPE_ID, type(impl).__name__, impl.invocation_phase())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
#        logging.getLogger('cone').debug(msg)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
    # Create temporary variables
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
    temp_feature_refs = impls.create_temp_features(config)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   324
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
    if reffilters is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
        reffilters.extend(temp_feature_refs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   327
        logging.getLogger('cone').info('Refs from temporary variables:\n%s' % '\n'.join(temp_feature_refs))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   328
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   329
    # Set overrides only after temp variables are created, so that
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   330
    # they can also be modified from the command line
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   331
    if options.overrides:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   332
        # Make sure that the last layer is the autodata layer
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   333
        plugin.get_autoconfig(config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   334
        for override in options.overrides:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   335
            (ref,value) = override.split('=',1)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   336
            config.get_default_view().get_feature(ref).set_value(value)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   337
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   338
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   339
    # ---------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   340
    # Generate output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   341
    # ---------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   342
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   343
    context = plugin.GenerationContext(configuration = config,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   344
                                       tags = impltags or {},
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   345
                                       tags_policy = tags_policy,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   346
                                       output = options.output,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   347
                                       impl_set = impls,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   348
                                       temp_features = temp_feature_refs,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   349
                                       filter_by_refs = filter_by_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   350
    context.changed_refs = reffilters
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   351
    context.output = options.output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   352
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   353
    impls.output = options.output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   354
    for phase in impls.INVOCATION_PHASES:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   355
        log.info("Generating phase '%s'" % phase)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   356
        context.phase = phase
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   357
        impls.generate(context)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   358
        impls.post_generate(context)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   359
     
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   360
    if options.what:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   361
        log.info("Write output files to '%s'" % options.what)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   362
        output_files = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   363
        for op in context.get_output():
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   364
            # Only append once
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   365
            if op.type == 'file' and output_files.count(op.abspath) < 1:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   366
                output_files.append(op.abspath)       
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   367
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   368
            mkpath(os.path.dirname(os.path.abspath(options.what)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   369
            what_fh = open(os.path.abspath(options.what), 'w')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   370
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   371
                [what_fh.write('%s\n' % ofile) for ofile in output_files]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   372
                print "Wrote output file list to '%s'" % options.what
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   373
            finally:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   374
                what_fh.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   375
        except Exception:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   376
            log.info("Could not create directory for '%s'" % options.what)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
    print "Generated %s to %s!" % (options.configuration, impls.output)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   380
    # Store temporary rule execution outputs to a new configuration
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   381
    if options.dump_autodata:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   382
        # Make sure autodata layer is the one we're dealing with     
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   383
        plugin.get_autoconfig(config)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   384
        lastconfig = config.get_last_configuration()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   385
        lastconfig.set_name(utils.resourceref.to_objref(utils.resourceref.get_filename(utils.resourceref.norm(options.dump_autodata))))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   386
        data = persistentconfml.dumps(lastconfig)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   387
        try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   388
            mkpath(utils.resourceref.get_path(utils.resourceref.norm(options.dump_autodata)))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   389
            fh = open(options.dump_autodata, 'w')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   390
            try:        fh.write(data)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   391
            finally:    fh.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   392
            print 'Saved autodata to %s' % options.dump_autodata
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   393
        except DistutilsFileError:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   394
            log.info('Unable to dump autodata')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   395
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
    # ---------------
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
    # Generate report
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
    # ---------------
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   400
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
    # If reporting is enabled collect data for report
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
    if options.report != None or options.report_data_output != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
        logging.getLogger('cone').info('Collecting data for report.')
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   404
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   405
        rep_data = generation_report.ReportData() 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   406
        rep_data.context = context
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   407
        rep_data.context.log_file = os.path.abspath(options.log_file)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   408
        rep_data.context.log = _read_log(options.log_file)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   409
        rep_data.project_dir = options.project
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
        logging.getLogger('cone').info('Collecting data found rep_data  %s' % rep_data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
        duration = str("%.3f" % (time.time() - start_time) )
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
        rep_data.set_duration( duration )
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   414
        rep_data.options = options
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
        # Save intermediary report data file if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
        if options.report_data_output != None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
            logging.getLogger('cone').info('Dumping report data to %s' % options.report_data_output)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
            print "Dumping report data to '%s'" % options.report_data_output
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
            generation_report.save_report_data(rep_data, options.report_data_output)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
        # Generate the report if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
        if options.report != None:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   424
            generation_report.generate_report([rep_data], options.report, options.template, [ROOT_PATH], options.report_option)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
            print_summary(rep_data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
    if current: current.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   429
def _read_log(log_file):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   430
    logf = open(log_file)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   431
    # strip endlines
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   432
    return [line.strip('\n') for line in logf.readlines()]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   433
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
def _get_new_refs(old_refs, new_refs):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
    Return a distinct array of refs in ``new_refs`` that are not present in ``old_refs``.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
    """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
    result = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
    for ref in new_refs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   440
        if ref not in old_refs and ref not in result:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   441
            result.append(ref)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   442
    return result
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   443
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   444
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   445
def _filter_by_refs(config, options, parser):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   446
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   447
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   448
    filter_by_refs = True
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   449
    if options.all_layers:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   450
        filter_by_refs = False 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   451
    elif not options.layers and not options.layer_regexes and not options.layer_wildcards:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   452
        filter_by_refs = False
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   453
    return filter_by_refs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   454
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   455
def _get_included_layers(config, options, parser):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   456
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   457
    Collect a list of included layer root paths from the config based on the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   458
    given parameters in options.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   459
    @return: A list of layer configuration paths (empty if all layers
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   460
        should be generated).
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   461
    """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   462
    # --all-layers overrides all other definitions
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   463
    if options.all_layers:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   464
        options.layers = [i for i in range(len(config.list_configurations()))] 
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   465
    elif not options.layers and not options.layer_regexes and not options.layer_wildcards:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   466
        options.layers = [i for i in range(len(config.list_configurations()))]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   467
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   468
    # Command line definitions override others
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   469
    if options.layers or options.layer_regexes or options.layer_wildcards:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   470
        layer_paths = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   471
        all_layers = config.list_configurations()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   472
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   473
        for layer_index in options.layers or []:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   474
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   475
                layer_paths.append(all_layers[int(layer_index)])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   476
            except (IndexError, ValueError):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   477
                parser.error("Invalid layer index: %s" % layer_index)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   478
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   479
        for regex in options.layer_regexes or []:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   480
            for layer_path in all_layers:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   481
                if re.search(regex, layer_path):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   482
                    layer_paths.append(layer_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   483
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   484
        for wildcard in options.layer_wildcards or []:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   485
            for layer_path in all_layers:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   486
                if fnmatch.fnmatch(layer_path, wildcard):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   487
                    layer_paths.append(layer_path)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   488
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   489
        if not layer_paths:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   490
            parser.error('No layers matched by layer patterns')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   491
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   492
        return utils.distinct_array(layer_paths)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   493
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   494
    # Use iMaker API definitions if no others have been specified
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   495
    return _get_included_layers_from_imaker_api(config, parser)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   496
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   497
def _get_included_layers_from_imaker_api(config, parser):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   498
    try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   499
        layer_str_list = (config.get_default_view().get_feature('imakerapi.cone_layers').get_value() or '').split(',')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   500
        # Make sure that empty layers definitions are ignored
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   501
        layer_str_list = utils.distinct_array(layer_str_list)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   502
        if '' in layer_str_list:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   503
            layer_str_list.remove('')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   504
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   505
        all_layers = config.list_configurations()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   506
        layerdefs = []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   507
        for layerstr in layer_str_list:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   508
            try:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   509
                layerdefs.append(all_layers[int(layerstr)])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   510
            except (ValueError, IndexError):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   511
                parser.error("Invalid layer index from iMaker API: %s" % layerstr)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   512
        return layerdefs
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   513
    except exceptions.NotFound:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   514
        return []
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   515
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   516
def print_summary(rep_data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   517
    """ Prints generation summary to logger and console. """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   518
    print "\nGENERATION SUMMARY:"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   519
    print "--------------------"
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   520
    print "Refs in files: %s" % len(rep_data.context.changed_refs)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   521
    print "Refs with no implementation: %s" % len(rep_data.context.get_refs_with_no_output())
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   522
    print "Generation duration: %s" % rep_data.duration
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   523
    print "\n\n"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   524
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   525
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   526
if __name__ == "__main__":
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   527
    main()