summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.proj8
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.dllbin53248 -> 55296 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.pdbbin130560 -> 136704 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.targets1
-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
7 files changed, 100 insertions, 4 deletions
diff --git a/build.proj b/build.proj
index 52f1c94..bfed28b 100644
--- a/build.proj
+++ b/build.proj
@@ -119,10 +119,11 @@
<MSBuild Projects="@(ToolProjects)" />
- <!-- clean up any previous drop with the same name so we don't aggregate files. -->
- <RemoveDir Directories="$(ToolsDirectory)" Condition="'$(NoClean)' != 'true'" />
<MakeDir Directories="@(ToolsDirectory)" />
<Copy SourceFiles="@(AllToolSources)" DestinationFiles="@(AllToolTargets)" SkipUnchangedFiles="true" />
+
+ <!-- remove files that shouldn't be in the directory (perhaps from a previous version). -->
+ <Purge Directories="$(ToolsDirectory)" IntendedFiles="@(AllToolTargets)" />
</Target>
<Target Name="Tools" DependsOnTargets="ToolsLayout">
@@ -200,7 +201,6 @@
<Output TaskParameter="Outputs" ItemName="ProjectTemplatesTransformSource" />
</Trim>
<MSBuild Projects="@(ProjectTemplates)" />
- <RemoveDir Directories="$(ProjectTemplatesLayoutPath)" Condition="'$(NoClean)' != 'true'" />
<Copy SourceFiles="@(ProjectTemplatesSource)" DestinationFiles="@(ProjectTemplatesLayout)" SkipUnchangedFiles="true" />
<CopyWithTokenSubstitution SourceFiles="@(ProjectTemplatesTransformSource)" DestinationFiles="@(ProjectTemplatesTransformLayout)" SkipUnchangedFiles="true">
<Output TaskParameter="CopiedFiles" ItemName="CopiedProjectTemplateFiles" />
@@ -376,9 +376,9 @@
</ItemGroup>
<!-- clean up any previous drop with the same name so we don't aggregate files. -->
- <RemoveDir Directories="$(DropDirectory)" Condition="'$(NoClean)' != 'true'" />
<MakeDir Directories="@(DropDirectories)" />
<Copy SourceFiles="@(AllDropSources)" DestinationFiles="@(AllDropTargets)" SkipUnchangedFiles="true" />
+ <Purge Directories="$(DropDirectory)" IntendedFiles="@(AllDropTargets)" />
<!-- fix up the samples so that they will compile right out of the drop -->
<ItemGroup>
<SampleProjectTargets Include="$(DropSamplesDirectory)\**\*.csproj" />
diff --git a/lib/DotNetOpenAuth.BuildTasks.dll b/lib/DotNetOpenAuth.BuildTasks.dll
index 0c4e4a9..bcd26a7 100644
--- a/lib/DotNetOpenAuth.BuildTasks.dll
+++ b/lib/DotNetOpenAuth.BuildTasks.dll
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.pdb b/lib/DotNetOpenAuth.BuildTasks.pdb
index 98e94f8..2f4251a 100644
--- a/lib/DotNetOpenAuth.BuildTasks.pdb
+++ b/lib/DotNetOpenAuth.BuildTasks.pdb
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.targets b/lib/DotNetOpenAuth.BuildTasks.targets
index e376877..dc586c9 100644
--- a/lib/DotNetOpenAuth.BuildTasks.targets
+++ b/lib/DotNetOpenAuth.BuildTasks.targets
@@ -25,5 +25,6 @@
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="DiscoverProjectTemplates" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="FixupReferenceHintPaths" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="AddProjectItems" />
+ <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="Purge" />
</Project>
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, @"\\+", @"\");
+ }
+ }
+}