X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FMicrosoft.Build.Engine%2FMicrosoft.Build.BuildEngine%2FBuildTask.cs;h=d0048815a18d690db6de37c8f4c9cb578c394355;hb=60979ce4a41d1be8f9d3d4d38162c0803207b4d5;hp=c06d2be8f180316e46d9ab33096d49a0d3ec679f;hpb=d4e1ed0407d433a942cc7c4d73d1cb7a743634db;p=mono.git diff --git a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTask.cs b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTask.cs index c06d2be8f18..d0048815a18 100644 --- a/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTask.cs +++ b/mcs/class/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildTask.cs @@ -25,8 +25,6 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -#if NET_2_0 - using System; using System.Collections; using System.Collections.Generic; @@ -37,11 +35,12 @@ using Microsoft.Build.Framework; using Microsoft.Build.Utilities; namespace Microsoft.Build.BuildEngine { - public class BuildTask { + public class BuildTask : IBuildTask { ITaskHost hostObject; Target parentTarget; XmlElement taskElement; + TaskLoggingHelper task_logger; internal BuildTask (XmlElement taskElement, Target parentTarget) { @@ -83,21 +82,38 @@ namespace Microsoft.Build.BuildEngine { [MonoTODO] public bool Execute () { - bool result; + bool result = false; TaskEngine taskEngine; LogTaskStarted (); - - taskEngine = new TaskEngine (parentTarget.Project); - - taskEngine.Prepare (InitializeTask (), this.taskElement, GetParameters (), this.Type); - - result = taskEngine.Execute (); - - taskEngine.PublishOutput (); - - LogTaskFinished (result); - + ITask task = null; + + try { + try { + task = InitializeTask (); + } catch (Exception e) { + LogError ("Error initializing task {0}: {1}", taskElement.LocalName, e.Message); + LogMessage (MessageImportance.Low, "Error initializing task {0}: {1}", + taskElement.LocalName, e.ToString ()); + return false; + } + + try { + taskEngine = new TaskEngine (parentTarget.Project); + taskEngine.Prepare (task, this.taskElement, GetParameters (), this.Type); + result = taskEngine.Execute (); + if (result) + taskEngine.PublishOutput (); + } catch (Exception e) { + task_logger.LogError ("Error executing task {0}: {1}", taskElement.LocalName, e.Message); + task_logger.LogMessage (MessageImportance.Low, + "Error executing task {0}: {1}", taskElement.LocalName, e.ToString ()); + result = false; + } + } finally { + LogTaskFinished (result); + } + return result; } @@ -107,13 +123,11 @@ namespace Microsoft.Build.BuildEngine { List tempNames = new List (); foreach (XmlAttribute xmlAttribute in taskElement.Attributes) { - if (xmlAttribute.Name == "Condition") - continue; - if (xmlAttribute.Name == "ContinueOnError") + if (xmlAttribute.Name == "Condition" || xmlAttribute.Name == "ContinueOnError") continue; tempNames.Add (xmlAttribute.Name); } - + return tempNames.ToArray (); } @@ -142,28 +156,54 @@ namespace Microsoft.Build.BuildEngine { else taskElement.SetAttribute (parameterName, parameterValue); } - + void LogTaskStarted () { - TaskStartedEventArgs tsea = new TaskStartedEventArgs ("Task started.", null, parentTarget.Project.FullFileName, - parentTarget.Project.FullFileName, taskElement.Name); + TaskStartedEventArgs tsea = new TaskStartedEventArgs ("Task started.", null, + parentTarget.Project.FullFileName, + parentTarget.TargetFile, taskElement.Name); parentTarget.Project.ParentEngine.EventSource.FireTaskStarted (this, tsea); } void LogTaskFinished (bool succeeded) { - TaskFinishedEventArgs tfea = new TaskFinishedEventArgs ("Task finished.", null, parentTarget.Project.FullFileName, - parentTarget.Project.FullFileName, taskElement.Name, succeeded); + TaskFinishedEventArgs tfea = new TaskFinishedEventArgs ("Task finished.", null, + parentTarget.Project.FullFileName, + parentTarget.TargetFile, taskElement.Name, succeeded); parentTarget.Project.ParentEngine.EventSource.FireTaskFinished (this, tfea); } + + void LogError (string message, + params object[] messageArgs) + { + parentTarget.Project.ParentEngine.LogError (message, messageArgs); + } + void LogMessage (MessageImportance importance, + string message, + params object[] messageArgs) + { + parentTarget.Project.ParentEngine.LogMessage (importance, message, messageArgs); + } + ITask InitializeTask () { ITask task; - task = (ITask)Activator.CreateInstance (this.Type); - task.BuildEngine = new BuildEngine (parentTarget.Project.ParentEngine, 0, 0, ContinueOnError, - parentTarget.Project.FullFileName); + try { + task = (ITask)Activator.CreateInstance (this.Type); + } catch (InvalidCastException) { + LogMessage (MessageImportance.Low, "InvalidCastException, ITask: {0} Task type: {1}", + typeof (ITask).AssemblyQualifiedName, this.Type.AssemblyQualifiedName); + throw; + } + parentTarget.Project.ParentEngine.LogMessage ( + MessageImportance.Low, + "Using task {0} from {1}", Name, this.Type.AssemblyQualifiedName); + + task.BuildEngine = new BuildEngine (parentTarget.Project.ParentEngine, parentTarget.Project, + parentTarget.TargetFile, 0, 0, ContinueOnError); + task_logger = new TaskLoggingHelper (task); return task; } @@ -174,9 +214,8 @@ namespace Microsoft.Build.BuildEngine { string[] parameterNames = GetParameterNames (); - foreach (string s in parameterNames) { + foreach (string s in parameterNames) parameters.Add (s, GetParameterValue (s)); - } return parameters; } @@ -198,8 +237,9 @@ namespace Microsoft.Build.BuildEngine { return false; else { Expression exp = new Expression (); - exp.Parse (str); - return (bool) exp.ConvertTo (parentTarget.Project, typeof (bool)); + exp.Parse (str, ParseOptions.AllowItemsNoMetadataAndSplit); + return (bool) exp.ConvertTo (parentTarget.Project, typeof (bool), + ExpressionOptions.ExpandItemRefs); } } set { @@ -226,13 +266,29 @@ namespace Microsoft.Build.BuildEngine { get { return taskElement; } set { taskElement = value; } } - + [MonoTODO] public Type Type { get { return parentTarget.Project.TaskDatabase.GetTypeFromClassName (Name); } } + + public IEnumerable GetAttributes () + { + foreach (XmlAttribute attrib in TaskElement.Attributes) + yield return attrib.Value; + foreach (XmlNode xn in TaskElement.ChildNodes) { + XmlElement xe = xn as XmlElement; + if (xe == null) + continue; + + //FIXME: error on any other child + if (String.Compare (xe.LocalName, "Output", StringComparison.Ordinal) == 0) { + foreach (XmlAttribute attrib in xe.Attributes) + yield return attrib.Value; + } + } + } + } } - -#endif