--- a/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py Fri Mar 12 08:30:17 2010 +0200
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py Tue Aug 10 14:29:28 2010 +0300
@@ -22,14 +22,27 @@
import re
import os
-import sys
import logging
import types
+import pkg_resources
import subprocess
-import __init__
+
+from cone.public import plugin,utils
-from cone.public import exceptions,plugin,utils,api, settings
+def get_folder_set(folder):
+ """
+ Get a set object containing all files of given folder
+ @param folder: the folder to create set for
+ @return: a python set
+ """
+ fileset = set()
+ for (root, _, filenames) in os.walk(folder):
+ for filename in filenames:
+ fname = utils.relpath(os.path.join(root,filename), folder)
+ fileset.add(fname)
+
+ return fileset
class CommandImpl(plugin.ImplBase):
"""
@@ -47,13 +60,16 @@
self.desc = ""
self.logger = logging.getLogger('cone.commandml(%s)' % self.ref)
self.reader = reader
+ for element in self.reader.elements:
+ element.set_logger(self.logger)
def generate(self, context=None):
"""
Generate the given implementation.
"""
- self.create_output()
+
+ self.create_output(context)
return
def generate_layers(self,layers):
@@ -64,17 +80,26 @@
self.create_output(layers)
return
- def create_output(self, layers=None):
+ def create_output(self, context, layers=None):
"""
Function to generate output files.
"""
-
+ self.context = context
tmpDict = self.__create_helper_variables()
-
+ # Get the contents of output folder before the generation
+ outset_before = get_folder_set(context.output)
for element in self.reader.elements:
#Element can be either command or condition.
element.set_logger(self.logger)
- element.execute(tmpDict)
+ element.execute(context, tmpDict)
+
+ # Get the contents of output folder after the generation
+ # and get the new files created by the set difference.
+ # NOTE! this does not recognize files outside output folder!
+ outset_after = get_folder_set(context.output)
+ outset = outset_after - outset_before
+ for outfile in outset:
+ context.add_file(outfile, implementation=self)
return
def __create_helper_variables(self):
@@ -82,8 +107,8 @@
Internal function to create dictionary containing most often used ConE "environment" variables.
"""
tmp = {}
- tmp["%CONE_OUT%"] = self.output
- tmp["%CONE_OUT_ABSOLUTE%"] = os.path.abspath(self.output)
+ tmp["%CONE_OUT%"] = os.path.join(self.context.output, self.output).rstrip('\\')
+ tmp["%CONE_OUT_ABSOLUTE%"] = os.path.abspath(os.path.join(self.context.output, self.output)).rstrip('\\')
return tmp
def has_ref(self, refs):
@@ -100,6 +125,8 @@
Parses a single commandml file
"""
NAMESPACE = 'http://www.s60.com/xml/commandml/1'
+ NAMESPACE_ID = 'commandml'
+ ROOT_ELEMENT_NAME = 'commandml'
FILE_EXTENSIONS = ['commandml']
def __init__(self):
@@ -122,7 +149,11 @@
if reader.tags:
impl.set_tags(reader.tags)
return impl
-
+
+ @classmethod
+ def get_schema_data(cls):
+ return pkg_resources.resource_string('commandplugin', 'xsd/commandml.xsd')
+
def set_default_view(self, dview):
"""
Function to set default view that is needed when solving out ConfML reference information
@@ -260,17 +291,17 @@
cmd.set_logger(logger)
def add_command(self, command):
- self.command.append(command)
+ self.commands.append(command)
- def execute(self, replaceDict=None):
- if self.__solve_condition(self.condition):
+ def execute(self, context, replaceDict=None):
+ if self._solve_condition(self.condition, context):
#Condition is true -> running command
for command in self.commands:
- command.execute(replaceDict)
+ command.execute(context, replaceDict)
else:
self.logger.info("Ignoring %s because it is evaluated as False." % self.condition)
- def __solve_condition(self, condition_str):
+ def _solve_condition(self, condition_str, context):
"""
Internal function to handle condition
"""
@@ -278,7 +309,7 @@
#Expanding ConfML information
modstr = utils.expand_delimited_tokens(
condition_str,
- lambda ref, index: repr(self.dview.get_feature(ref).get_value()))
+ lambda ref, index: repr(context.configuration.get_default_view().get_feature(ref).get_value()))
return eval(modstr)
else:
#Empty condition is true always.
@@ -323,8 +354,7 @@
self.cwd = cwd
def set_all_envs(self, envs):
- if envs:
- self.envs = eval(envs)
+ self.envs = envs
def set_default_view(self, dview):
self.dview = dview
@@ -401,9 +431,17 @@
for filter in self.filters:
filter.report(self.logger)
- def execute(self, replaceDict=None):
+ def execute(self, context, replaceDict=None):
+ self.dview = context.configuration.get_default_view()
+
self.solve_refs()
+ try:
+ if self.envs: env_dict = eval(self.envs)
+ else: env_dict = None
+ except Exception, e:
+ raise RuntimeError("Failed to evaluate env dictionary: %s: %s" % (e.__class__.__name__, e))
+
exit_code = 0
try:
try:
@@ -415,8 +453,8 @@
self.logger.info("Running command: \"%s\"" % command_str)
self.logger.info("with args: shell=%s envs=%s cwd=%s bufsize=%s stdin=%s stdout=%s stderr=%s" \
% (self.shell, self.envs, cwd, self.bufsize, \
- self.get_pipe("stdin", 'r'),self.get_pipe("stdout"), self.get_pipe("stderr")))
- pid = subprocess.Popen(command_str, shell=self.shell, env=self.envs, cwd=cwd,\
+ self.get_pipe("stdin", 'r'),self.get_pipe("stdout"), self.get_pipe("stderr")))
+ pid = subprocess.Popen(command_str, shell=self.shell, env=env_dict, cwd=cwd,\
bufsize=self.bufsize, stdin = self.get_pipe("stdin", 'r'),\
stdout = self.get_pipe("stdout"), stderr = self.get_pipe("stderr"))
#Waiting for process to complete
@@ -452,6 +490,7 @@
self.shell = self.__solve_ref(self.shell)
self.bufsize = self.__solve_ref(self.bufsize)
self.cwd = self.__solve_ref(self.cwd)
+ self.envs = self.__solve_ref(self.envs)
for argument in self.arguments:
self.arguments[self.arguments.index(argument)] = self.__solve_ref(argument)
for pipe in self.pipes.keys():