Author: msierad
Date: 2005-08-26 18:44:01 -0400 (Fri, 26 Aug 2005)
New Revision: 48932

Added:
   trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.Engine.targets
   trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework.targets
   trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks.targets
   trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities.targets
   trunk/xbuild/Microsoft.Build.csproj
   trunk/xbuild/Microsoft.Common.tasks
   trunk/xbuild/xbuild/XBuild.targets
Modified:
   trunk/xbuild/ChangeLog
   trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs
   
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs
   trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ChangeLog
   
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs
   trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs
   
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ImportedProject.cs
   
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ItemReference.cs
   
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs
   trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
   trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs
   
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildErrorEventArgs.cs
   
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildEventArgs.cs
   
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildWarningEventArgs.cs
   trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/ChangeLog
   trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AL.cs
   trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/ChangeLog
   trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Csc.cs
   trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Exec.cs
   trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ChangeLog
   trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/Logger.cs
   
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskLoggingHelper.cs
   trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs
   trunk/xbuild/README
Log:
2005-08-27  Marek Sieradzki  <[EMAIL PROTECTED]>

        * Microsoft.Build.Engine: Added transforms.
        * Microsoft.Build.Utilities: Added error/warning handling in ToolTask.



Modified: trunk/xbuild/ChangeLog
===================================================================
--- trunk/xbuild/ChangeLog      2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/ChangeLog      2005-08-26 22:44:01 UTC (rev 48932)
@@ -1,3 +1,9 @@
+2005-08-27  Marek Sieradzki  <[EMAIL PROTECTED]>
+
+       * Microsoft.Build.Engine, Microsoft.Build.Framework,
+       Microsoft.Build.Utilities, Microsoft.Build.Tasks, xbuild: Added test
+       files which can be used to build xbuild.
+
 2005-08-06  Marek Sieradzki  <[EMAIL PROTECTED]>
 
        * xbuild: Initial check-in of command line tool.

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs    
    2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItem.cs    
    2005-08-26 22:44:01 UTC (rev 48932)
@@ -28,6 +28,7 @@
 using System;
 using System.Collections;
 using System.IO;
+using System.Text;
 using System.Xml;
 using Microsoft.Build.Framework;
 using Microsoft.Build.Utilities;
@@ -125,12 +126,55 @@
 
                public string GetMetadata (string metadataName)
                {
-                       string value = GetEvaluatedMetadata (metadataName);
-                       if (value == null)
-                               return String.Empty;
+                       if (evaluatedMetadata.Contains (metadataName) == true)
+                               return (string) evaluatedMetadata 
[metadataName];
                        else
-                               return value;
+                               return CheckBuiltinMetadata (metadataName);
                }
+               
+               private string CheckBuiltinMetadata (string metadataName)
+               {
+                       if (File.Exists (finalItemSpec)) {
+                               switch (metadataName.ToLower ()) {
+                               case "fullpath":
+                                       return Path.GetFullPath (finalItemSpec);
+                                       break;
+                               case "rootdir":
+                                       return "/";
+                                       break;
+                               case "filename":
+                                       return Path.GetFileNameWithoutExtension 
(finalItemSpec);
+                                       break;
+                               case "extension":
+                                       return Path.GetExtension 
(finalItemSpec);
+                                       break;
+                               case "relativedir":
+                                       return Path.GetDirectoryName 
(finalItemSpec);
+                                       break;
+                               case "directory":
+                                       return Path.GetDirectoryName 
(Path.GetFullPath (finalItemSpec));
+                                       break;
+                               case "recursivedir":
+                                       return recursiveDir;
+                                       break;
+                               case "identity":
+                                       return Path.Combine 
(Path.GetDirectoryName (finalItemSpec), Path.GetFileName (finalItemSpec));
+                                       break;
+                               case "modifiedtime":
+                                       return File.GetLastWriteTime 
(finalItemSpec).ToString ();
+                                       break;
+                               case "createdtime":
+                                       return File.GetCreationTime 
(finalItemSpec).ToString ();
+                                       break;
+                               case "accessedtime":
+                                       return File.GetLastAccessTime 
(finalItemSpec).ToString ();
+                                       break;
+                               default:
+                                       return String.Empty;
+                               }
+                       } else
+                               return String.Empty;
+               }
 
                public bool HasMetadata (string metadataName)
                {
@@ -273,18 +317,41 @@
                        }
                }
                
-               internal new string ToString ()
+               internal new string ToString (Expression transform)
                {
-                       return finalItemSpec;
+                       return GetItemSpecFromTransform (transform);
                }
                
-               internal ITaskItem ToITaskItem ()
+               internal ITaskItem ToITaskItem (Expression transform)
                {
                        TaskItem taskItem;
-                       taskItem = new TaskItem (finalItemSpec, (IDictionary) 
evaluatedMetadata.Clone ());
+                       taskItem = new TaskItem (GetItemSpecFromTransform 
(transform), (IDictionary) evaluatedMetadata.Clone ());
                        return taskItem;
                }
 
+               private string GetItemSpecFromTransform (Expression transform)
+               {
+                       StringBuilder sb;
+               
+                       if (transform == null)
+                               return finalItemSpec;
+                       else {
+                               sb = new StringBuilder ();
+                               foreach (object o in transform) {
+                                       if (o is string) {
+                                               sb.Append ((string)o);
+                                       } else if (o is PropertyReference) {
+                                               sb.Append 
(((PropertyReference)o).ToString ());
+                                       } else if (o is ItemReference) {
+                                               sb.Append 
(((ItemReference)o).ToString ());
+                                       } else if (o is MetadataReference) {
+                                               sb.Append (GetMetadata 
(((MetadataReference)o).MetadataName));
+                                       }
+                               }
+                               return sb.ToString ();
+                       }
+               }
+
                public string Condition {
                        get {
                                if (condition == null)

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs
   2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/BuildItemGroup.cs
   2005-08-26 22:44:01 UTC (rev 48932)
@@ -117,7 +117,6 @@
                        buildItems.RemoveAt (index);
                }
 
-               // sealed doesn't work
                public BuildItem[] ToArray ()
                {
                        BuildItem[] array;
@@ -132,7 +131,6 @@
                                throw new ArgumentNullException ("xmlElement");
                        this.condition = xmlElement.GetAttributeNode 
("Condition");
                        this.itemGroupElement = xmlElement;
-                       //foreach (XmlElement xe in xmlElement.ChildNodes) {
                        foreach (XmlNode xn in xmlElement.ChildNodes) {
                                if (xn is XmlElement) {
                                        XmlElement xe = (XmlElement) xn;
@@ -143,21 +141,21 @@
                        }
                }
                
-               internal string ToString (string separator)
+               internal string ToString (Expression transform, string 
separator)
                {
                        string[] items = new string [buildItems.Count];
                        int i = 0;
                        foreach (BuildItem bi in  buildItems)
-                               items [i++] = bi.ToString ();
+                               items [i++] = bi.ToString (transform);
                        return String.Join (separator,items);
                }
                
-               internal ITaskItem[] ToITaskItemArray ()
+               internal ITaskItem[] ToITaskItemArray (Expression transform)
                {
                        ITaskItem[] array = new ITaskItem [buildItems.Count];
                        int i = 0;
                        foreach (BuildItem item in buildItems)
-                               array [i++] = item.ToITaskItem ();
+                               array [i++] = item.ToITaskItem (transform);
                        return array;
                }
 

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ChangeLog
===================================================================
--- trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ChangeLog   
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ChangeLog   
2005-08-26 22:44:01 UTC (rev 48932)
@@ -1,3 +1,16 @@
+2005-08-27  Marek Sieradzki  <[EMAIL PROTECTED]>
+
+       * Target.cs: Added checks for target existence.
+       * BuildItemGroup.cs: Changed to use transforms.
+       * MetadataReference.cs: Wrote real implementation.
+       * ItemReference.cs: Rewritten to use transforms.
+       * BuildItem.cs: Changes for transforms and metadata.
+       * ConsoleLogger.cs: Added verbosity checking and fixed error/warning
+       formatting.
+       * Project.cs: Fixed project importing.
+       * ImportedProject.cs: Changed to throw exceptions instead of returning
+       bool.
+
 2005-08-24  Marek Sieradzki  <[EMAIL PROTECTED]>
 
        * Engine.cs: Removed FIXME.

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs
    2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ConsoleLogger.cs
    2005-08-26 22:44:01 UTC (rev 48932)
@@ -38,10 +38,10 @@
                int             indent;
                LoggerVerbosity verbosity;
                WriteHandler    writeHandler;
-               TimeSpan        taskStart;
+               TimeSpan                taskStart;
                int             errorCount;
                int             warningCount;
-               DateTime        buildStart;
+               DateTime                buildStart;
                bool            performanceSummary;
                bool            summary;
                
@@ -56,7 +56,7 @@
                        this.indent = 0;
                        this.errorCount = 0;
                        this.warningCount = 0;
-                       this.writeHandler += new 
WriteHandler(WriteHandlerFunction);
+                       this.writeHandler += new WriteHandler 
(WriteHandlerFunction);
                        this.performanceSummary = false;
                        this.summary = true;
                }
@@ -117,7 +117,7 @@
                
                public void ProjectFinished (object sender, 
ProjectFinishedEventArgs args)
                {
-                       if (verbosity == LoggerVerbosity.Diagnostic) {
+                       if (IsVerbosityGreaterOrEqual 
(LoggerVerbosity.Diagnostic)) {
                                WriteLine (String.Format ("Done building 
project \"{0}\".", args.ProjectFile));
                                WriteLine ("");
                        }
@@ -132,7 +132,7 @@
                public void TargetFinished (object sender, 
TargetFinishedEventArgs args)
                {
                        indent--;
-                       if (this.verbosity == LoggerVerbosity.Diagnostic)
+                       if (IsVerbosityGreaterOrEqual 
(LoggerVerbosity.Diagnostic))
                                WriteLine (String.Format ("Done building target 
\"{0}\" in project \"{1}\".",
                                        args.TargetName, args.ProjectFile));
                        WriteLine ("");
@@ -154,26 +154,22 @@
                
                public void MessageRaised (object sender, BuildMessageEventArgs 
args)
                {
-                       // FIXME: check for importance and verbosity
-                       //WriteLineWithSender (sender, args.Message);
-                       WriteLine (args.Message);
+                       if (IsMessageOk (args)) {
+                               WriteLine (args.Message);
+                       }
                }
                
                public void WarningRaised (object sender, BuildWarningEventArgs 
args)
                {
-                       string warning = String.Format (": Warning 
{0}({1},{2})",
-                               args.File, args.LineNumber, args.ColumnNumber);
-                       //WriteLineWithSender (sender, warning);
-                       WriteLine (args.Message);
+                       if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) 
+                               WriteLineWithoutIndent (FormatWarningEvent 
(args));
                        warningCount++;
                }
                
                public void ErrorRaised (object sender, BuildErrorEventArgs 
args)
                {
-                       string error = String.Format (": Error {0}({1},{2})",
-                               args.File, args.LineNumber, args.ColumnNumber);
-                       //WriteLineWithSender (sender, error);
-                       WriteLine (args.Message);
+                       if (IsVerbosityGreaterOrEqual 
(LoggerVerbosity.Minimal)) 
+                               WriteLineWithoutIndent (FormatErrorEvent 
(args));
                        errorCount++;
                }
                
@@ -184,6 +180,11 @@
                        writeHandler (message);
                }
                
+               private void WriteLineWithoutIndent (string message)
+               {
+                       writeHandler (message);
+               }
+               
                private void WriteLineWithSender (object sender, string message)
                {
                        if ((string) sender == "MSBuild")
@@ -218,7 +219,59 @@
                public virtual void Shutdown ()
                {
                }
+               
+               private string FormatErrorEvent (BuildErrorEventArgs args)
+               {
+                       // FIXME: show more complicated args
+                       if (args.LineNumber != 0 && args.ColumnNumber != 0) {
+                               return String.Format ("{0}({1},{2}): {3} error 
{4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
+                                       args.Subcategory, args.Code, 
args.Message);
+                       } else {
+                               return String.Format ("{0}: {1} error {2}: 
{3}", args.File, args.Subcategory, args.Code,
+                                       args.Message);
+                       }
+               }
 
+               private string FormatWarningEvent (BuildWarningEventArgs args)
+               {
+                       // FIXME: show more complicated args
+                       if (args.LineNumber != 0 && args.ColumnNumber != 0) {
+                               return String.Format ("{0}({1},{2}): {3} 
warning {4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
+                                       args.Subcategory, args.Code, 
args.Message);
+                       } else {
+                               return String.Format ("{0}: {1} warning {2}: 
{3}", args.File, args.Subcategory, args.Code,
+                                       args.Message);
+                       }
+               }
+               
+               private bool IsMessageOk (BuildMessageEventArgs bsea)
+               {
+                       if (bsea.Importance == MessageImportance.High && 
IsVerbosityGreaterOrEqual (LoggerVerbosity.Minimal)) {
+                               return true;
+                       } else if (bsea.Importance == MessageImportance.Normal 
&& IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) {
+                               return true;
+                       } else if (bsea.Importance == MessageImportance.Low && 
IsVerbosityGreaterOrEqual (LoggerVerbosity.Detailed)) {
+                               return true;
+                       } else
+                               return false;
+               }
+               
+                private bool IsVerbosityGreaterOrEqual (LoggerVerbosity v)
+                {
+                               if (v == LoggerVerbosity.Diagnostic) {
+                                       return LoggerVerbosity.Diagnostic <= 
verbosity;
+                               } else if (v == LoggerVerbosity.Detailed) {
+                                       return LoggerVerbosity.Detailed <= 
verbosity;
+                               } else if (v == LoggerVerbosity.Normal) {
+                                       return LoggerVerbosity.Normal <= 
verbosity;
+                               } else if (v == LoggerVerbosity.Minimal) {
+                                       return LoggerVerbosity.Minimal <= 
verbosity;
+                               } else if (v == LoggerVerbosity.Quiet) {
+                                       return true;
+                               } else
+                                       return false;
+                }
+
                public string Parameters {
                        get {
                                return parameters;

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs   
    2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Expression.cs   
    2005-08-26 22:44:01 UTC (rev 48932)
@@ -36,6 +36,7 @@
        
                IList   objects;
                Project project;
+               ItemReference parentItemReference;
        
                public Expression (Project project)
                {
@@ -84,6 +85,14 @@
                                                eState = 
EvaluationState.InProperty;
                                                start = current;
                                                break;
+                                       case '%':
+                                               if (temp.Length > 0) {
+                                                       objects.Add 
(temp.ToString ());
+                                                       temp = new 
StringBuilder ();
+                                               }
+                                               eState = 
EvaluationState.InMetadata;
+                                               start = current;
+                                               break;
                                        default:
                                                temp.Append (it.Current);
                                                if (current == source.Length - 
1)
@@ -94,10 +103,10 @@
                                case EvaluationState.InItem:
                                        switch (it.Current) {
                                        case '(':
-                                               if (pState == ParenState.Out)
+                                               if (pState == ParenState.Out && 
aState == ApostropheState.Out)
                                                        pState = 
ParenState.Left;
-                                               else
-                                                       throw new Exception 
("'(' expected.");
+                                               else if (aState == 
ApostropheState.Out)
+                                                       throw new Exception 
("'(' not expected.");
                                                break;
                                        case ')':
                                                if (pState == ParenState.Left 
&& aState == ApostropheState.Out) {
@@ -135,6 +144,23 @@
                                                break;
                                        }
                                        break;
+                               case EvaluationState.InMetadata:
+                                       switch (it.Current) {
+                                       case '(':
+                                               if (pState == ParenState.Out)
+                                                       pState = 
ParenState.Left;
+                                               break;
+                                       case ')':
+                                               if (pState == ParenState.Left) {
+                                                       objects.Add (new 
MetadataReference (this, source.Substring (start, current - start + 1)));
+                                                       eState = 
EvaluationState.Out;
+                                                       pState = ParenState.Out;
+                                               }
+                                               break;
+                                       default:
+                                               break;
+                                       }
+                                       break;
                                default:
                                        throw new Exception ("Invalid 
evaluation state.");
                                        break;
@@ -178,7 +204,7 @@
                        return objects;
                }
                
-               private string ToString ()
+               public new string ToString ()
                {
                        StringBuilder sb = new StringBuilder ();
                        
@@ -218,7 +244,10 @@
                public ITaskItem ToITaskItem ()
                {
                        ITaskItem item;
-
+                       
+                       if (objects == null)
+                               throw new Exception ("Cannot cast empty 
expression to ITaskItem.");
+                       
                        if (objects [0] is ItemReference) {
                                ItemReference ir = (ItemReference) objects [0];
                                ITaskItem[] array = ir.ToITaskItemArray ();
@@ -298,11 +327,16 @@
                public Project Project {
                        get { return project; }
                }
+               
+               public ItemReference ParentItemReference {
+                       get { return parentItemReference; }
+               }
        }
 
        internal enum EvaluationState {
                Out,
                InItem,
+               InMetadata,
                InProperty
        }
        
@@ -315,4 +349,11 @@
                In,
                Out
        }
-}
+       
+       internal enum ItemParsingState {
+               Name,
+               Transform1,
+               Transform2,
+               Separator
+       }
+}
\ No newline at end of file

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ImportedProject.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ImportedProject.cs
  2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ImportedProject.cs
  2005-08-26 22:44:01 UTC (rev 48932)
@@ -41,13 +41,12 @@
                {
                }
                
-               public bool Load (string filename)
+               public void Load (string filename)
                {
                        if (filename == null)
                                throw new ArgumentNullException ("filename");
                        
                        StreamReader sr = new StreamReader (filename);
-                       bool result = false;
                        try {
                                string text = sr.ReadToEnd ();
                                size = text.Length;
@@ -55,15 +54,13 @@
                                xmlDocument.LoadXml (text);
                                lastWrite = File.GetLastWriteTime (filename);
                                fullFileName = filename;
-                               result = true;
                        }
                        catch (Exception ex) {
-                               result = false;
+                               throw;
                        }
                        finally {
                                sr.Close ();
                        }
-                       return result;
                }
                
                public XmlDocument XmlDocument {

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ItemReference.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ItemReference.cs
    2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/ItemReference.cs
    2005-08-26 22:44:01 UTC (rev 48932)
@@ -1,5 +1,5 @@
 //
-// ItemReference.cs
+// ItemReference.cs: Represents "@(Reference)" in expression.
 //
 // Author:
 //   Marek Sieradzki ([EMAIL PROTECTED])
@@ -36,8 +36,7 @@
                string          itemName;
                string          separator;
                Expression      parent;
-               // FIXME: should it be that way?
-               //Expression    transform;
+               Expression      transform;
        
                public ItemReference (Expression parent)
                {
@@ -56,18 +55,24 @@
                
                public void ParseSource (string source)
                {
+                       string sourceWithoutParens;
+                       ApostropheState aState = ApostropheState.Out;
+                       ItemParsingState iState = ItemParsingState.Name;
+                       int c = -1;
+                       int itemNameEnd;
+                       int transformEnd = -1;
+                       int separatorStart = -1;
+               
                        if (source == null)
                                throw new ArgumentNullException ("source");
-                       // add support for transforms
                
                        if (source.Length < 3)
                                throw new ArgumentException ("Invalid item.");
-                       string sourceWithoutParens = source.Substring (2, 
source.Length - 3);
-                       ApostropheState aState = ApostropheState.Out;
-                       int c = -1;
-                       bool separatorSet = false;
                        
+                       sourceWithoutParens = source.Substring (2, 
source.Length - 3);
+                       itemNameEnd = sourceWithoutParens.Length - 1;
                        CharEnumerator it = sourceWithoutParens.GetEnumerator 
();
+
                        while (it.MoveNext ()) {
                                c++;
                                if (it.Current == '\'') {
@@ -75,18 +80,39 @@
                                                aState = ApostropheState.Out;
                                        else
                                                aState = ApostropheState.In;
-                                       continue;
-                               } else if (it.Current == ',') {
-                                       if (aState == ApostropheState.Out) {
-                                               separator = 
sourceWithoutParens.Substring (c + 2, sourceWithoutParens.Length - c - 3);
-                                               itemName = 
sourceWithoutParens.Substring (0, c);
-                                               separatorSet = true;
-                                               break;
-                                       }
+                               } else if (it.Current == '-' && iState == 
ItemParsingState.Name && aState == ApostropheState.Out) {
+                                       iState = ItemParsingState.Transform1;
+                                       itemNameEnd = c - 1;
+                               } else if (it.Current == '>' && iState == 
ItemParsingState.Transform1 && aState == ApostropheState.Out) {
+                                       iState = ItemParsingState.Transform2;
+                               } else if (iState == 
ItemParsingState.Transform2 && aState == ApostropheState.Out && c == 
sourceWithoutParens.Length - 1) {
+                                       transformEnd = c;
+                               } else if (iState == 
ItemParsingState.Transform2 && aState == ApostropheState.Out && it.Current == 
',') {
+                                       transformEnd = c - 1;
+                                       separatorStart = c + 1;
+                                       break;
+                               } else if (iState == ItemParsingState.Name && 
aState == ApostropheState.Out && it.Current == ',') {
+                                       separatorStart = c + 1;
+                                       itemNameEnd = c - 1;
+                                       break;
                                }
                        }
-                       if (separatorSet == false) {
-                               itemName = sourceWithoutParens;
+                       itemName = sourceWithoutParens.Substring (0, 
itemNameEnd + 1);
+                       if (transformEnd != -1) {
+                               if (separatorStart != -1) {
+                                       separator = 
sourceWithoutParens.Substring (separatorStart + 1, sourceWithoutParens.Length
+                                               - separatorStart - 2);
+                                       transform = new Expression 
(parent.Project, sourceWithoutParens.Substring (itemNameEnd + 4, transformEnd
+                                               - itemNameEnd - 4));
+                               } else {
+                                       transform = new Expression 
(parent.Project, sourceWithoutParens.Substring (itemNameEnd + 4, 
sourceWithoutParens.Length
+                                               - itemNameEnd - 5));
+                               }
+                       } else {
+                               if (separatorStart != -1) {
+                                       separator = 
sourceWithoutParens.Substring (separatorStart + 1, sourceWithoutParens.Length
+                                               - separatorStart - 2);
+                               }
                        }
                }
                
@@ -97,7 +123,7 @@
                                BuildItemGroup big;
                                if (p.EvaluatedItemsByName.Contains (itemName)) 
{
                                        big = 
(BuildItemGroup)p.EvaluatedItemsByName [itemName];
-                                       return big.ToITaskItemArray ();
+                                       return big.ToITaskItemArray (transform);
                                } else
                                        return null;
                        } else
@@ -111,7 +137,7 @@
                                BuildItemGroup big;
                                if (p.EvaluatedItemsByName.Contains (itemName)) 
{
                                        big = 
(BuildItemGroup)p.EvaluatedItemsByName [itemName];
-                                       return big.ToString (separator);
+                                       return big.ToString (transform, 
separator);
                                } else
                                        return String.Empty;
                        } else
@@ -126,4 +152,4 @@
                        get { return separator; }
                }
        }
-}
+}
\ No newline at end of file

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs
        2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/MetadataReference.cs
        2005-08-26 22:44:01 UTC (rev 48932)
@@ -26,6 +26,8 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 using System;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
 
 namespace Microsoft.Build.BuildEngine {
        internal class MetadataReference {
@@ -44,21 +46,33 @@
                public MetadataReference (Expression parent, string source)
                {
                        this.parent = parent;
-                       Evaluate (source);
+                       ParseSource (source);
                }
                
                public MetadataReference (Expression parent, string itemName, 
string metadataName)
                {
                        this.parent = parent;
-                       //Evaluate (itemName, metadataName);
+                       this.itemName = itemName;
+                       this.metadataName = metadataName;
                }
                
-               public void Evaluate (string source)
+               public void ParseSource (string source)
                {
-                       if (source.Length < 3)
+                       string sourceWithoutParens;
+                       int dot;
+               
+                       if (source.Length < 4)
                                throw new ArgumentException ("source is too 
short.");
-                       //metadataName = 
-                       //return item.GetEvaluatedMetadata (source.Substring 
(2, source.Length -3 ));
+                       
+                       sourceWithoutParens = source.Substring (2, 
source.Length - 3);
+                       dot = sourceWithoutParens.IndexOf ('.');
+                       
+                       if (dot != -1) {
+                               itemName = sourceWithoutParens.Substring (0, 
dot);
+                               metadataName = sourceWithoutParens.Substring 
(dot + 1, sourceWithoutParens.Length - dot - 1); 
+                       } else {
+                               metadataName = sourceWithoutParens;
+                       }
                }
                
                public string ItemName {

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs
===================================================================
--- trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs  
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Project.cs  
2005-08-26 22:44:01 UTC (rev 48932)
@@ -450,10 +450,13 @@
                        }
                        
                        ImportedProject importedProject = new ImportedProject 
();
-                       importedProject.Load (importedFile);
-                       Console.WriteLine (importedFile);
-                       ProcessElements 
(importedProject.XmlDocument.DocumentElement, importedProject);
-                       
+                       try {
+                               importedProject.Load (importedFile);
+                               ProcessElements 
(importedProject.XmlDocument.DocumentElement, importedProject);
+                       }
+                       catch (Exception ex) {
+                               Console.WriteLine (ex);
+                       }
                }
                
                private void AddItemGroup (XmlElement xmlElement)
@@ -617,7 +620,7 @@
                                name = sourceWithoutParens;
                        }
                        if (evaluatedItemsByName.Contains (name))
-                               return ((BuildItemGroup) evaluatedItemsByName 
[name]).ToString (separator);
+                               return ((BuildItemGroup) evaluatedItemsByName 
[name]).ToString (null, separator);
                        else
                                return "";
                }

Modified: 
trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs
===================================================================
--- trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs   
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.BuildEngine/Target.cs   
2005-08-26 22:44:01 UTC (rev 48932)
@@ -93,9 +93,13 @@
                        } else if (dependsOnTargets.Value == "") {
                                ;
                        } else {
-                               string[] targetsToBuildFirst = 
dependsOnTargets.Value.Split (';');
+                               Expression dependencies = new Expression 
(Project, dependsOnTargets.Value);
+                               string [] targetsToBuildFirst = 
dependencies.ToString ().Split (';');
                                foreach (string target in targetsToBuildFirst) {
-                                       Target t = (Target) project.Targets 
[target];
+                                       string trimmed = target.Trim ();
+                                       Target t = (Target) project.Targets 
[trimmed];
+                                       if (t == null)
+                                               throw new 
InvalidProjectFileException (String.Format ("Target {0} not found.", trimmed));
                                        if (t.BuildState == 
BuildState.NotStarted) {
                                                t.Build ();
                                        }

Added: trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.Engine.targets
===================================================================
--- trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.Engine.targets  
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Engine/Microsoft.Build.Engine.targets  
2005-08-26 22:44:01 UTC (rev 48932)
@@ -0,0 +1,16 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+       <ItemGroup>
+               <MicrosoftBuildEngineSources 
Include="Microsoft.Build.Engine/Microsoft.Build.BuildEngine/*.cs" />
+               <MicrosoftBuildEngineDll Include="Microsoft.Build.Engine.dll" />
+               <MicrosoftBuildEngineReferences 
Include="Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.dll" />
+       </ItemGroup>
+       <Target Name="MicrosoftBuildEngine" >
+               <Csc
+                       Sources="@(MicrosoftBuildEngineSources)"
+                       TargetType="library"
+                       OutputAssembly="@(MicrosoftBuildEngineDll)"
+                       References="@(MicrosoftBuildEngineReferences)"
+                       WarningLevel="3"
+               />
+       </Target>
+</Project>

Modified: 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildErrorEventArgs.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildErrorEventArgs.cs
     2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildErrorEventArgs.cs
     2005-08-26 22:44:01 UTC (rev 48932)
@@ -31,15 +31,15 @@
 namespace Microsoft.Build.Framework {
        [Serializable]
        public class BuildErrorEventArgs : BuildEventArgs {
-               string code;
-               int columnNumber;
-               int endColumnNumber;
-               int endLineNumber;
-               string file;
-               int lineNumber;
-               string subcategory;
+       
+               string  code;
+               int     columnNumber;
+               int     endColumnNumber;
+               int     endLineNumber;
+               string  file;
+               int     lineNumber;
+               string  subcategory;
                
-               // FIXME: what is that for?
                protected BuildErrorEventArgs ()
                {
                }

Modified: 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildEventArgs.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildEventArgs.cs
  2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildEventArgs.cs
  2005-08-26 22:44:01 UTC (rev 48932)
@@ -33,6 +33,7 @@
 {
        [Serializable]          
        public abstract class BuildEventArgs : System.EventArgs {
+       
                protected string helpKeyword;
                protected string message;
                protected string senderName;
@@ -40,7 +41,7 @@
                protected DateTime timeStamp;
                
                protected BuildEventArgs ()
-                       : this(null, null, null)
+                       : this (null, null, null)
                {
                }
 
@@ -50,8 +51,7 @@
                        this.message = message;
                        this.helpKeyword = helpKeyword;
                        this.senderName = senderName;
-                       Thread c = Thread.CurrentThread;
-                       this.threadId = c.GetHashCode ();
+                       this.threadId = Thread.CurrentThread.GetHashCode ();
                        this.timeStamp = DateTime.Now;
                }
 

Modified: 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildWarningEventArgs.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildWarningEventArgs.cs
   2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/BuildWarningEventArgs.cs
   2005-08-26 22:44:01 UTC (rev 48932)
@@ -31,6 +31,7 @@
 namespace Microsoft.Build.Framework {
        [Serializable]
        public class BuildWarningEventArgs : BuildEventArgs {
+       
                protected string subcategory;
                protected string code;
                protected string file;
@@ -55,6 +56,7 @@
                        this.subcategory = subcategory;
                        this.code = code;
                        this.file = file;
+                       this.lineNumber = lineNumber;
                        this.columnNumber = columnNumber;
                        this.endLineNumber = endLineNumber;
                        this.endColumnNumber = endColumnNumber;

Modified: 
trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/ChangeLog
===================================================================
--- trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/ChangeLog  
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework/ChangeLog  
2005-08-26 22:44:01 UTC (rev 48932)
@@ -1,3 +1,9 @@
+2005-08-27  Marek Sieradzki  <[EMAIL PROTECTED]>
+
+       * BuildErrorEventArgs.cs: Formatting.
+       * BuildWarningEventArgs.cs: Fixed ctor.
+       * BuildEventArgs.cs: Formatting.
+
 2005-08-19  Marek Sieradzki  <[EMAIL PROTECTED]>
 
        * TargetFinishedEventArgs.cs: Added Succeeded property.

Added: trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework.targets
===================================================================
--- trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework.targets    
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Framework/Microsoft.Build.Framework.targets    
2005-08-26 22:44:01 UTC (rev 48932)
@@ -0,0 +1,15 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+       <ItemGroup>
+               <MicrosoftBuildFrameworkSources 
Include="Microsoft.Build.Framework/Microsoft.Build.Framework/*.cs" />
+               <MicrosoftBuildFrameworkSources 
Include="Microsoft.Build.Framework/Mono.XBuild.Shared/*.cs" />
+               <MicrosoftBuildFrameworkDll 
Include="Microsoft.Build.Framework.dll" />
+       </ItemGroup>
+       <Target Name="MicrosoftBuildFramework" >
+               <Csc
+                       Sources="@(MicrosoftBuildFrameworkSources)"
+                       TargetType="library"
+                       OutputAssembly="@(MicrosoftBuildFrameworkDll)"
+                       WarningLevel="3"
+               />
+       </Target>
+</Project>

Modified: trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AL.cs
===================================================================
--- trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AL.cs      
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/AL.cs      
2005-08-26 22:44:01 UTC (rev 48932)
@@ -68,25 +68,11 @@
                string          win32Resource;
 
                Process alProcess;
-               static  Regex regex;
        
                public AL ()
                {
                }
                
-               static AL ()
-               {
-                       regex = new Regex (
-                               @"^\s*"
-                               + 
@"(((?<ORIGIN>(((\d+>)?[a-zA-Z]?:[^:]*)|([^:]*))):)"
-                               + "|())"
-                               + "(?<SUBCATEGORY>(()|([^:]*? )))"
-                               + "(?<CATEGORY>(error|warning)) "
-                               + "(?<CODE>[^:]*):"
-                               + "(?<TEXT>.*)$",
-                               RegexOptions.IgnoreCase);
-               }
-
                protected internal override void AddResponseFileCommands (
                                                 CommandLineBuilderExtension 
commandLine)
                {

Modified: trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/ChangeLog
===================================================================
--- trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/ChangeLog  
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/ChangeLog  
2005-08-26 22:44:01 UTC (rev 48932)
@@ -1,3 +1,9 @@
+2005-08-27  Marek Sieradzki  <[EMAIL PROTECTED]>
+
+       * Exec.cs: Removed "exited".
+       * AL.cs: Removed Regex.
+       * Csc.cs: Changed default GenerateFullPaths to false.
+
 2005-08-24  Marek Sieradzki  <[EMAIL PROTECTED]>
 
        * Exec.cs: Reformatted and added try/catch.

Modified: trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Csc.cs
===================================================================
--- trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Csc.cs     
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Csc.cs     
2005-08-26 22:44:01 UTC (rev 48932)
@@ -79,7 +79,7 @@
                                commandLine.AppendSwitch ("/nostdlib");
                        if (Optimize)
                                commandLine.AppendSwitch ("/optimize");
-                       commandLine.AppendSwitchIfNotNull ("/out:", 
OutputAssembly);
+                       commandLine.AppendSwitchIfNotNull ("/out:", 
OutputAssembly.ItemSpec);
                        //platform
                        if (References != null) {
                                foreach (ITaskItem item in References) {
@@ -169,7 +169,7 @@
                }
 
                public bool GenerateFullPaths {
-                       get { return GetBoolParameterWithDefault 
("GenerateFullPaths", true); }
+                       get { return GetBoolParameterWithDefault 
("GenerateFullPaths", false); }
                        set { Bag ["GenerateFullPaths"] = value; }
                }
 

Modified: trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Exec.cs
===================================================================
--- trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Exec.cs    
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks/Exec.cs    
2005-08-26 22:44:01 UTC (rev 48932)
@@ -46,7 +46,6 @@
                string          workingDirectory;
                
                Process         process;
-               bool            exited;
                int             executionTime;
                
                public Exec ()
@@ -54,7 +53,6 @@
                        process = new Process ();
                        timeout = Int32.MaxValue;
                        ignoreExitCode = false;
-                       exited = false;
                        executionTime = 0;
                }
 

Added: trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks.targets
===================================================================
--- trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks.targets    
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Tasks/Microsoft.Build.Tasks.targets    
2005-08-26 22:44:01 UTC (rev 48932)
@@ -0,0 +1,23 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+       <ItemGroup>
+               <MicrosoftBuildTasksSources 
Include="Microsoft.Build.Tasks/Microsoft.Build.Tasks/*.cs" />
+               <MicrosoftBuildTasksSources
+                       
Include="Microsoft.Build.Tasks/Microsoft.Build.Tasks.Hosting/*.cs"
+                       
Exclude="Microsoft.Build.Tasks/Microsoft.Build.Tasks.Hosting/CscHostObject.cs"
+                />
+               <MicrosoftBuildTasksSources 
Include="Microsoft.Build.Tasks/Mono.XBuild.Tasks.GenerateResourceInternal/*.cs" 
/>
+               <MicrosoftBuildTasksDll Include="Microsoft.Build.Tasks.dll" />
+               <MicrosoftBuildTasksReferences 
Include="Microsoft.Build.Framework.dll" />
+               <MicrosoftBuildTasksReferences 
Include="Microsoft.Build.Utilities.dll" />
+               <MicrosoftBuildTasksReferences Include="System.Windows.Forms" />
+       </ItemGroup>
+       <Target Name="MicrosoftBuildTasks" 
DependsOnTargets="MicrosoftBuildFramework;MicrosoftBuildUtilities">
+               <Csc
+                       Sources="@(MicrosoftBuildTasksSources)"
+                       TargetType="library"
+                       OutputAssembly="@(MicrosoftBuildTasksDll)"
+                       References="@(MicrosoftBuildTasksReferences)"
+                       WarningLevel="3"
+               />
+       </Target>
+</Project>

Modified: 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ChangeLog
===================================================================
--- trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ChangeLog  
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ChangeLog  
2005-08-26 22:44:01 UTC (rev 48932)
@@ -1,3 +1,9 @@
+2005-08-27  Marek Sieradzki  <[EMAIL PROTECTED]>
+
+       * Logger.cs: Formatting.
+       * ToolTask.cs: Added error/warning handling.
+       * TaskLoggingHelper.cs: Fixed LogErrorFromException ().
+
 2005-08-24  Marek Sieradzki  <[EMAIL PROTECTED]>
 
        * CommandLineBuilder.cs: Added checking for null values.

Modified: 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/Logger.cs
===================================================================
--- trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/Logger.cs  
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/Logger.cs  
2005-08-26 22:44:01 UTC (rev 48932)
@@ -71,9 +71,9 @@
                                args.Subcategory, args.Code, args.Message);
                }
 
-               public abstract void Initialize(IEventSource eventSource);
+               public abstract void Initialize (IEventSource eventSource);
 
-               public virtual void Shutdown()
+               public virtual void Shutdown ()
                {
                }
        }

Modified: 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskLoggingHelper.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskLoggingHelper.cs
       2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/TaskLoggingHelper.cs
       2005-08-26 22:44:01 UTC (rev 48932)
@@ -105,7 +105,8 @@
                {
                        StringBuilder sb = new StringBuilder ();
                        sb.Append (e.Message);
-                       sb.Append (e.StackTrace);
+                       if (showStackTrace == true)
+                               sb.Append (e.StackTrace);
                        BuildErrorEventArgs beea = new BuildErrorEventArgs (
                                null, null, null, 0, 0, 0, 0, sb.ToString (),
                                e.HelpLink, e.Source);

Modified: 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs
===================================================================
--- 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs    
    2005-08-26 22:38:23 UTC (rev 48931)
+++ 
trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities/ToolTask.cs    
    2005-08-26 22:44:01 UTC (rev 48932)
@@ -1,5 +1,5 @@
 //
-// ToolTask.cs:
+// ToolTask.cs: Base class for command line tool tasks. 
 //
 // Author:
 //   Marek Sieradzki ([EMAIL PROTECTED])
@@ -42,6 +42,8 @@
                string                  toolPath;
                Process                 process;
                
+               static Regex            regex;
+               
                protected ToolTask ()
                        : this (null, null)
                {
@@ -59,6 +61,19 @@
                        this.HelpKeywordPrefix = helpKeywordPrefix;
                }
 
+               static ToolTask ()
+               {
+                       regex = new Regex (
+                               @"^\s*"
+                               + 
@"(((?<ORIGIN>(((\d+>)?[a-zA-Z]?:[^:]*)|([^:]*))):)"
+                               + "|())"
+                               + "(?<SUBCATEGORY>(()|([^:]*? )))"
+                               + "(?<CATEGORY>(error|warning)) "
+                               + "(?<CODE>[^:]*):"
+                               + "(?<TEXT>.*)$",
+                               RegexOptions.IgnoreCase);
+               }
+
                protected virtual bool CallHostObjectToExecute ()
                {
                        return true;
@@ -75,6 +90,8 @@
                
                private bool RealExecute (string filename, string arguments)
                {
+                       string line;
+               
                        if (filename == null)
                                throw new ArgumentNullException ("filename");
                        if (arguments == null)
@@ -88,20 +105,97 @@
                        process.StartInfo.RedirectStandardOutput = true;
                        process.StartInfo.UseShellExecute = false;
                        
-                       Log.LogMessage (MessageImportance.Normal, String.Format 
("Tool {0} execution started with arguments: {1}",
+                       Log.LogMessage (MessageImportance.Low, String.Format 
("Tool {0} execution started with arguments: {1}",
                                filename, arguments));
                        
                        process.Start ();
                        process.WaitForExit ();
                        
+                       while ((line = process.StandardError.ReadLine ()) != 
null) {
+                               HandleError (line);
+                       }
+                       
                        Log.LogMessage (MessageImportance.Low, String.Format 
("Tool {0} execution finished.", filename));
                        
-                       return true;
+                       return !Log.HasLoggedErrors;
                }
                
                private void HandleError (string line)
                {
+                       string filename, origin, category, code, subcategory, 
text;
+                       int lineNumber, columnNumber, endLineNumber, 
endColumnNumber;
+               
+                       Match m = regex.Match (line);
+                       origin = m.Groups [regex.GroupNumberFromName 
("ORIGIN")].Value;
+                       category = m.Groups [regex.GroupNumberFromName 
("CATEGORY")].Value;
+                       code = m.Groups [regex.GroupNumberFromName 
("CODE")].Value;
+                       subcategory = m.Groups [regex.GroupNumberFromName 
("SUBCATEGORY")].Value;
+                       text = m.Groups [regex.GroupNumberFromName 
("TEXT")].Value;
+                       
+                       ParseOrigin (origin, out filename, out lineNumber, out 
columnNumber, out endLineNumber, out endColumnNumber);
+                       
+                       if (category == "warning") {
+                               Log.LogWarning (subcategory, code, null, 
filename, lineNumber, columnNumber, endLineNumber,
+                                       endColumnNumber, text, null);
+                       } else if (category == "error") {
+                               Log.LogError (subcategory, code, null, 
filename, lineNumber, columnNumber, endLineNumber,
+                                       endColumnNumber, text, null);
+                       }
                }
+               
+               private void ParseOrigin (string origin, out string filename,
+                                    out int lineNumber, out int columnNumber,
+                                    out int endLineNumber, out int 
endColumnNumber)
+               {
+                       int lParen;
+                       string[] temp;
+                       string[] left, right;
+                       
+                       if (origin.IndexOf ('(') != -1 ) {
+                               lParen = origin.IndexOf ('(');
+                               filename = origin.Substring (0, lParen);
+                               temp = origin.Substring (lParen + 1, 
origin.Length - lParen - 2).Split (',');
+                               if (temp.Length == 1) {
+                                       left = temp [0].Split ('-');
+                                       if (left.Length == 1) {
+                                               lineNumber = Int32.Parse (left 
[0]);
+                                               columnNumber = 0;
+                                               endLineNumber = 0;
+                                               endColumnNumber = 0;
+                                       } else if (left.Length == 2) {
+                                               lineNumber = Int32.Parse (left 
[0]);
+                                               columnNumber = 0;
+                                               endLineNumber = Int32.Parse 
(left [1]);
+                                               endColumnNumber = 0;
+                                       } else
+                                               throw new Exception ("Invalid 
line/column format.");
+                               } else if (temp.Length == 2) {
+                                       right = temp [1].Split ('-');
+                                       lineNumber = Int32.Parse (temp [0]);
+                                       endLineNumber = 0;
+                                       if (right.Length == 1) {
+                                               columnNumber = Int32.Parse 
(right [0]);
+                                               endColumnNumber = 0;
+                                       } else if (right.Length == 2) {
+                                               columnNumber = Int32.Parse 
(right [0]);
+                                               endColumnNumber = Int32.Parse 
(right [0]);
+                                       } else
+                                               throw new Exception ("Invalid 
line/column format.");
+                               } else if (temp.Length == 4) {
+                                       lineNumber = Int32.Parse (temp [0]);
+                                       endLineNumber = Int32.Parse (temp [2]);
+                                       columnNumber = Int32.Parse (temp [1]);
+                                       endColumnNumber = Int32.Parse (temp 
[3]);
+                               } else
+                                       throw new Exception ("Invalid 
line/column format.");
+                       } else {
+                               filename = origin;
+                               lineNumber = 0;
+                               columnNumber = 0;
+                               endLineNumber = 0;
+                               endColumnNumber = 0;
+                       }
+               }
 
                protected virtual string GenerateCommandLineCommands ()
                {

Added: trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities.targets
===================================================================
--- trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities.targets    
2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.Utilities/Microsoft.Build.Utilities.targets    
2005-08-26 22:44:01 UTC (rev 48932)
@@ -0,0 +1,16 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+       <ItemGroup>
+               <MicrosoftBuildUtilitiesSources 
Include="Microsoft.Build.Utilities/Microsoft.Build.Utilities/*.cs" />
+               <MicrosoftBuildUtilitiesDll 
Include="Microsoft.Build.Utilities.dll" />
+               <MicrosoftBuildUtilitiesReferences 
Include="Microsoft.Build.Framework.dll" />
+       </ItemGroup>
+       <Target Name="MicrosoftBuildUtilities" 
DependsOnTargets="MicrosoftBuildFramework">
+               <Csc
+                       Sources="@(MicrosoftBuildUtilitiesSources)"
+                       TargetType="library"
+                       OutputAssembly="@(MicrosoftBuildUtilitiesDll)"
+                       References="@(MicrosoftBuildUtilitiesReferences)"
+                       WarningLevel="3"
+                />
+       </Target>
+</Project>

Added: trunk/xbuild/Microsoft.Build.csproj
===================================================================
--- trunk/xbuild/Microsoft.Build.csproj 2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Build.csproj 2005-08-26 22:44:01 UTC (rev 48932)
@@ -0,0 +1,24 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+       <Import Project="Microsoft.Common.tasks" />
+       <Import Project="Microsoft.Build.Engine/Microsoft.Build.Engine.targets" 
/>
+       <Import 
Project="Microsoft.Build.Framework/Microsoft.Build.Framework.targets" />
+       <Import Project="Microsoft.Build.Tasks/Microsoft.Build.Tasks.targets" />
+       <Import 
Project="Microsoft.Build.Utilities/Microsoft.Build.Utilities.targets" />
+       <Import Project="xbuild/XBuild.targets" />
+       <ItemGroup>
+               <Targets Include="MicrosoftBuildEngine" />
+               <Targets Include="MicrosoftBuildFramework" />
+               <Targets Include="MicrosoftBuildTasks" />
+               <Targets Include="MicrosoftBuildUtilities" />
+               <Targets Include="XBuild" />
+       </ItemGroup>
+       <ItemGroup>
+               <DllsToClean Include="*.dll" />
+       </ItemGroup>
+       <Target Name="Clean" >
+               <Delete Files="@(DllsToClean)" />
+       </Target>
+       <Target Name="Main" DependsOnTargets="@(Targets)">
+               <Message Text="XBuild build is successful." />
+       </Target>
+</Project>

Added: trunk/xbuild/Microsoft.Common.tasks
===================================================================
--- trunk/xbuild/Microsoft.Common.tasks 2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/Microsoft.Common.tasks 2005-08-26 22:44:01 UTC (rev 48932)
@@ -0,0 +1,23 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"; >
+       <UsingTask TaskName="Microsoft.Build.Tasks.AL"                  
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Copy"                
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.CreateItem"          
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.CreateProperty"      
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Csc"                 
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Delete"              
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Error"               
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Exec"                
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.FindUnderPath"       
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.GenerateResource"    
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.GetFramworkPath"     
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.GetFramworkSdkPath"  
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.MakeDir"             
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Message"             
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.MSBuild"             
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.ReadLinesFromFile"   
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.RemoveDir"           
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.SignFile"            
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Touch"               
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.Warning"             
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+       <UsingTask TaskName="Microsoft.Build.Tasks.WriteLinesToFile"    
AssemblyFile="xbuild/bin/Debug/Microsoft.Build.Tasks.dll" />
+</Project>

Modified: trunk/xbuild/README
===================================================================
--- trunk/xbuild/README 2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/README 2005-08-26 22:44:01 UTC (rev 48932)
@@ -5,4 +5,7 @@
 Microsoft.Build.Tasks
 Microsoft.Build.Utilities
 
+There are .targets files that can be used to build XBuild. To do it you must 
have finished build in xbuild/bin/Debug.
+Microsoft.Build.csproj is not a regular VS2005 project.
+
 It is licensed on MIT X11 license.

Added: trunk/xbuild/xbuild/XBuild.targets
===================================================================
--- trunk/xbuild/xbuild/XBuild.targets  2005-08-26 22:38:23 UTC (rev 48931)
+++ trunk/xbuild/xbuild/XBuild.targets  2005-08-26 22:44:01 UTC (rev 48932)
@@ -0,0 +1,20 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003";>
+       <ItemGroup>
+               <XBuildSources Include="xbuild/*.cs" />
+               <XBuildExe Include="xbuild.exe" />
+               <!-- not all of them are really used -->
+               <XBuildReferences Include="Microsoft.Build.Engine.dll" />
+               <XBuildReferences Include="Microsoft.Build.Framework.dll" />
+               <XBuildReferences Include="Microsoft.Build.Utilities.dll" />
+               <XBuildReferences Include="Microsoft.Build.Tasks.dll" />
+       </ItemGroup>
+       <Target Name="XBuild" DependsOnTargets="MicrosoftBuildEngine">
+               <Csc
+                       Sources="@(XBuildSources)"
+                       TargetType="exe"
+                       OutputAssembly="@(XBuildExe)"
+                       References="@(XBuildReferences)"
+                       WarningLevel="3"
+               />
+       </Target>
+</Project>

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to