using System; using System.IO; using System.Collections.Generic; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Xamarin.MacDev.Tasks; namespace Xamarin.iOS.Tasks { public abstract class GetDirectoriesTaskBase : Task { public string SessionId { get; set; } [Required] public string Path { get; set; } public string Pattern { get; set; } public string Option { get; set; } public string Exclude { get; set; } [Output] public ITaskItem[] Directories { get; set; } public override bool Execute () { Log.LogTaskName ("GetDirectories"); Log.LogTaskProperty ("Path", Path); Log.LogTaskProperty ("Pattern", Pattern); Log.LogTaskProperty ("Option", Option); Log.LogTaskProperty ("Exclude", Exclude); var path = Path.Replace ('\\', '/').TrimEnd ('/'); var exclude = new HashSet (); var items = new List (); IEnumerable dirs; SearchOption option; if (!string.IsNullOrEmpty (Option)) { if (!Enum.TryParse (Option, out option)) { Log.LogError ("Unknown search option: {0}", Option); return false; } } else { option = SearchOption.TopDirectoryOnly; } if (!Directory.Exists (path)) { Directories = items.ToArray (); return !Log.HasLoggedErrors; } if (!string.IsNullOrEmpty (Pattern)) dirs = Directory.EnumerateDirectories (path, Pattern, option); else dirs = Directory.EnumerateDirectories (path, "*.*", option); if (!string.IsNullOrEmpty (Exclude)) { foreach (var rpath in Exclude.Split (new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) { var full = System.IO.Path.Combine (path, rpath.Replace ('\\', '/')); exclude.Add (full); } } foreach (var dir in dirs) { if (!exclude.Contains (dir)) items.Add (new TaskItem (dir)); } Directories = items.ToArray (); return !Log.HasLoggedErrors; } } }