summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj1
-rw-r--r--src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.sln (renamed from src/DotNetOpenAuth.BuildTasks/CustomMsBuildTasks.sln)6
-rw-r--r--src/DotNetOpenAuth.BuildTasks/Purge.cs88
3 files changed, 95 insertions, 0 deletions
diff --git a/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
index 7f84787..e41b1e6 100644
--- a/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
+++ b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
@@ -95,6 +95,7 @@
<Compile Include="CheckAdminRights.cs" />
<Compile Include="JsPack.cs" />
<Compile Include="ParseMaster.cs" />
+ <Compile Include="Purge.cs" />
<Compile Include="ReSignDelaySignedAssemblies.cs" />
<Compile Include="SetEnvironmentVariable.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
diff --git a/src/DotNetOpenAuth.BuildTasks/CustomMsBuildTasks.sln b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.sln
index 6eae4e0..c875882 100644
--- a/src/DotNetOpenAuth.BuildTasks/CustomMsBuildTasks.sln
+++ b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.sln
@@ -3,6 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetOpenAuth.BuildTasks", "DotNetOpenAuth.BuildTasks.csproj", "{AC231A51-EF60-437C-A33F-AF8ADEB8EB74}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{ABBE14A3-0404-4123-9093-E598C3DD3E9B}"
+ ProjectSection(SolutionItems) = preProject
+ ..\..\build.proj = ..\..\build.proj
+ ..\..\lib\DotNetOpenAuth.BuildTasks.targets = ..\..\lib\DotNetOpenAuth.BuildTasks.targets
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
diff --git a/src/DotNetOpenAuth.BuildTasks/Purge.cs b/src/DotNetOpenAuth.BuildTasks/Purge.cs
new file mode 100644
index 0000000..f23a6d9
--- /dev/null
+++ b/src/DotNetOpenAuth.BuildTasks/Purge.cs
@@ -0,0 +1,88 @@
+//-----------------------------------------------------------------------
+// <copyright file="Purge.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.BuildTasks {
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using Microsoft.Build.Utilities;
+ using Microsoft.Build.Framework;
+ using System.IO;
+ using System.Text.RegularExpressions;
+
+ /// <summary>
+ /// Purges directory trees of all directories and files that are not on a whitelist.
+ /// </summary>
+ /// <remarks>
+ /// This task performs a function similar to robocopy's /MIR switch, except that
+ /// this task does not require that an entire directory tree be used as the source
+ /// in order to purge old files from the destination.
+ /// </remarks>
+ public class Purge : Task {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Purge"/> class.
+ /// </summary>
+ public Purge() {
+ this.PurgeEmptyDirectories = true;
+ }
+
+ /// <summary>
+ /// Gets or sets the root directories to purge.
+ /// </summary>
+ /// <value>The directories.</value>
+ [Required]
+ public string[] Directories { get; set; }
+
+ /// <summary>
+ /// Gets or sets the files that should be NOT be purged.
+ /// </summary>
+ public ITaskItem[] IntendedFiles { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether empty directories will be deleted.
+ /// </summary>
+ /// <value>
+ /// The default value is <c>true</c>.
+ /// </value>
+ public bool PurgeEmptyDirectories { get; set; }
+
+ /// <summary>
+ /// Executes this instance.
+ /// </summary>
+ public override bool Execute() {
+ HashSet<string> intendedFiles = new HashSet<string>(this.IntendedFiles.Select(file => file.GetMetadata("FullPath")), StringComparer.OrdinalIgnoreCase);
+
+ foreach (string directory in this.Directories.Select(dir => NormalizePath(dir))) {
+ foreach (string existingFile in Directory.GetFiles(directory, "*", SearchOption.AllDirectories)) {
+ if (!intendedFiles.Contains(existingFile)) {
+ this.Log.LogWarning("Purging file \"{0}\".", existingFile);
+ File.Delete(existingFile);
+ }
+ }
+
+ if (this.PurgeEmptyDirectories) {
+ foreach (string subdirectory in Directory.GetDirectories(directory, "*", SearchOption.AllDirectories)) {
+ // We have to check for the existance of the directory because it MAY be
+ // a descendent of a directory we already deleted in this loop.
+ if (Directory.Exists(subdirectory)) {
+ if (Directory.GetDirectories(subdirectory).Length == 0 && Directory.GetFiles(subdirectory).Length == 0) {
+ this.Log.LogWarning("Purging empty directory \"{0}\".", subdirectory);
+ Directory.Delete(subdirectory);
+ }
+ }
+ }
+ }
+ }
+
+ return !this.Log.HasLoggedErrors;
+ }
+
+ private static string NormalizePath(string path) {
+ return Regex.Replace(path, @"\\+", @"\");
+ }
+ }
+}