using System; using System.Activities; using System.IO; using System.Text.RegularExpressions; using Microsoft.TeamFoundation.Build.Client; using Microsoft.TeamFoundation.Build.Workflow.Activities; using Microsoft.TeamFoundation.Build.Workflow.Tracking; namespace BuildProcess.Activities { [BuildActivity(HostEnvironmentOption.Agent)] public sealed class DeployFiles : CodeActivity { //Source dir being deployed from [RequiredArgument] public InArgument SourceDir { get; set; } //Destination dir being copied from [RequiredArgument] public InArgument DestinationDir { get; set; } //Files to exclude [RequiredArgument] public InArgument FileExclusions { get; set; } //Folders to exclude [RequiredArgument] public InArgument FolderExclusions { get; set; } //globals public string fileExclusionPattern = ""; public string folderExclusionPattern = ""; protected override void Execute(CodeActivityContext context) { // Obtain the runtime value of the Text input argument string fileExclusions = context.GetValue(this.FileExclusions); string folderExclusions = context.GetValue(this.FolderExclusions); string[] destinations = context.GetValue(this.DestinationDir); DirectoryInfo sourceDir = new DirectoryInfo(context.GetValue(this.SourceDir)); //parse exclusions, add them to regex patterns if (!String.IsNullOrWhiteSpace(fileExclusions)) { string[] fileexarr = fileExclusions.Split(','); fileExclusionPattern = "("; foreach (string s in fileexarr) { fileExclusionPattern += s.ToUpper().Trim().Replace(".", @"\.").Replace("*", @"[a-zA-Z0-9]*") + "|"; } if(fileExclusionPattern.EndsWith("|")) fileExclusionPattern = fileExclusionPattern.Substring(0, fileExclusionPattern.Length - 1); fileExclusionPattern += ")"; } if (!String.IsNullOrWhiteSpace(folderExclusions)) { string[] folderexarr = folderExclusions.Split(','); folderExclusionPattern = "("; foreach (string s in folderexarr) { folderExclusionPattern += s.ToUpper().Trim().Replace(".", @"\.").Replace("*", @"[a-zA-Z0-9]*") + "|"; } if(folderExclusionPattern.EndsWith("|")) folderExclusionPattern = folderExclusionPattern.Substring(0, folderExclusionPattern.Length - 1); folderExclusionPattern += ")"; } foreach (string dir in destinations) { DirectoryInfo destDir = new DirectoryInfo(dir); context.Track(new BuildInformationRecord() { Value = new BuildMessage() { Importance = BuildMessageImportance.High, Message = "Source: " + sourceDir.FullName + "\nDestination: " + destDir.FullName + "\nFolder Exclusion Pattern: " + folderExclusionPattern + "\nFile Exclusion Pattern: " + fileExclusionPattern, }, }); CopyDir(sourceDir, destDir); } } private void CopyDir(DirectoryInfo sourceDir, DirectoryInfo destDir) { //create destination dir if it doesn't exist if (!destDir.Exists) { destDir.Create(); } // get all files from current dir FileInfo[] files = sourceDir.GetFiles(); //copy ze files!! foreach (FileInfo file in files) { if (!String.IsNullOrWhiteSpace(fileExclusionPattern)) { if (!Regex.IsMatch(file.Name.ToUpper(), fileExclusionPattern)) { if (File.Exists(Path.Combine(destDir.FullName, file.Name))) { File.Delete(Path.Combine(destDir.FullName, file.Name)); } file.CopyTo(Path.Combine(destDir.FullName, file.Name)); } } else { if (File.Exists(Path.Combine(destDir.FullName, file.Name))) { File.Delete(Path.Combine(destDir.FullName, file.Name)); } file.CopyTo(Path.Combine(destDir.FullName, file.Name),true); } } // get subdirectories. DirectoryInfo[] dirs = sourceDir.GetDirectories(); foreach (DirectoryInfo dir in dirs) { // Get destination directory. string destinationDir = Path.Combine(destDir.FullName, dir.Name); if (!String.IsNullOrWhiteSpace(folderExclusionPattern)) { if (!Regex.IsMatch(dir.Name.ToUpper(), folderExclusionPattern)) { // Call CopyDirectory() recursively. CopyDir(dir, new DirectoryInfo(destinationDir)); } } else { // Call CopyDirectory() recursively. CopyDir(dir, new DirectoryInfo(destinationDir)); } } } } }