[xbuild] DirectoryScanner.HasWildcard - new method
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / DirectoryScanner.cs
index 22f8be82d2d034269451c51c0461428eca8d925a..d9c7345c4657dd93beae390b1d5b165402ccbe62 100644 (file)
@@ -57,7 +57,6 @@ namespace Microsoft.Build.BuildEngine {
                {
                        Dictionary <string, bool> excludedItems;
                        List <ITaskItem> includedItems;
-                       string[] splitExclude;
                        
                        if (includes == null)
                                throw new ArgumentNullException ("Includes");
@@ -84,7 +83,7 @@ namespace Microsoft.Build.BuildEngine {
                        FileInfo[] fileInfo;
 
                        string name = include_item.ItemSpec;
-                       if (name.IndexOf ('?') == -1 && name.IndexOf ('*') == -1) {
+                       if (!HasWildcard (name)) {
                                if (!excludedItems.ContainsKey (Path.GetFullPath(name)))
                                        includedItems.Add (include_item);
                        } else {
@@ -106,12 +105,20 @@ namespace Microsoft.Build.BuildEngine {
                                                offset = 1;
                                }
 
+                               string full_path = Path.GetFullPath (Path.Combine (Environment.CurrentDirectory, include_item.ItemSpec));
                                fileInfo = ParseIncludeExclude (separatedPath, offset, baseDirectory);
 
+                               int wildcard_offset = full_path.IndexOf ("**");
                                foreach (FileInfo fi in fileInfo) {
                                        if (!excludedItems.ContainsKey (fi.FullName)) {
                                                TaskItem item = new TaskItem (include_item);
                                                item.ItemSpec = fi.FullName;
+                                               if (wildcard_offset >= 0) {
+                                                       string rec_dir = Path.GetDirectoryName (fi.FullName.Substring (wildcard_offset));
+                                                       if (rec_dir.Length > 0)
+                                                               rec_dir += Path.DirectorySeparatorChar;
+                                                       item.SetMetadata ("RecursiveDir", rec_dir);
+                                               }
                                                includedItems.Add (item);
                                        }
                                }
@@ -203,6 +210,11 @@ namespace Microsoft.Build.BuildEngine {
                                return fi;
                        }
                }
+
+               public static bool HasWildcard (string expression)
+               {
+                       return expression.IndexOf ('?') >= 0 || expression.IndexOf ('*') >= 0;
+               }
                
                public DirectoryInfo BaseDirectory {
                        get { return baseDirectory; }