diff --git a/.gitignore b/.gitignore
index a6fc742..ec33e1c 100755
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ Output/
*.suo
*.user
build.bat
+/.vs/MSBuild.NugetContentRestore/v15/sqlite3/storage.ide
diff --git a/MSBuild.NugetContentRestore.Tasks/Extensions/DirectoryExtensions.cs b/MSBuild.NugetContentRestore.Tasks/Extensions/DirectoryExtensions.cs
index 593aa18..588b308 100755
--- a/MSBuild.NugetContentRestore.Tasks/Extensions/DirectoryExtensions.cs
+++ b/MSBuild.NugetContentRestore.Tasks/Extensions/DirectoryExtensions.cs
@@ -2,51 +2,99 @@
using System.IO;
using System.Linq;
+using Microsoft.Build.Evaluation;
+using Microsoft.Build.Framework;
+using Microsoft.Build.Utilities;
using MSBuild.NugetContentRestore.Tasks.Utilities;
namespace MSBuild.NugetContentRestore.Tasks.Extensions
{
public static class DirectoryExtensions
{
+ private static string CurrentProjectPath { get; set; }
+ private static Project CurrentProject { get; set; }
- public static void CopyTo(this DirectoryInfo source, string destination, bool recursive, Wildcard[] ignorePatterns, bool smartRestore)
+ public static void CopyTo(this DirectoryInfo source, string destination, bool recursive, Wildcard[] ignorePatterns, bool smartRestore, string projectPath, TaskLoggingHelper log)
{
if (source == null) throw new ArgumentNullException("source");
if (destination == null) throw new ArgumentNullException("destination");
if (!source.Exists) throw new DirectoryNotFoundException("Source directory not found: " + source.FullName);
var target = new DirectoryInfo(destination);
- string targetFile;
- FileInfo targetFileInfo;
if (!target.Exists) target.Create();
-
foreach (var file in source.GetFiles())
{
if (ignorePatterns.Any(p => p.IsMatch(file.Name))) continue;
- targetFile = Path.Combine(target.FullName, file.Name);
+ var targetFile = Path.Combine(target.FullName, file.Name);
if (smartRestore)
{
// perform additional checks to see if we really need to copy the file
- targetFileInfo = new FileInfo(targetFile);
+ var targetFileInfo = new FileInfo(targetFile);
// if target exists and source/target have same write time, skip copying this file (don't worry about file contents - turn off SmartRestore if wanting that)
if (targetFileInfo.Exists && file.LastWriteTime.Equals(targetFileInfo.LastWriteTime)) continue;
}
-
- file.CopyTo(targetFile, true);
+ if (string.Equals(file.Extension, ".pp", StringComparison.InvariantCultureIgnoreCase))
+ {
+ targetFile = targetFile.Substring(0, targetFile.Length - ".pp".Length);
+ log.LogMessage(MessageImportance.Low, "NugetContentRestore :: Processing Source Code Transformation for file '{0}' in project '{1}'", targetFile, projectPath);
+ ProccessSourceCodeTransformation(projectPath, file.FullName, targetFile, log);
+ }
+ else {
+ file.CopyTo(targetFile, true);
+ }
}
// Exit Condition
if (!recursive) return;
foreach (var directory in source.GetDirectories())
- CopyTo(directory, Path.Combine(target.FullName, directory.Name), recursive, ignorePatterns, smartRestore);
+ CopyTo(directory, Path.Combine(target.FullName, directory.Name), true, ignorePatterns, smartRestore, projectPath, log);
+ }
+
+ private static void ProccessSourceCodeTransformation(string projectPath, string sourcePath, string targetPath, TaskLoggingHelper log)
+ {
+ if (!string.Equals(CurrentProjectPath, projectPath, StringComparison.InvariantCultureIgnoreCase))
+ {
+ CurrentProjectPath = projectPath;
+ CurrentProject = new Project(CurrentProjectPath);
+ }
+
+ var source = File.ReadAllLines(sourcePath);
+ ReplaceProjectPropertyTokens(source, log);
+ File.WriteAllLines(targetPath, source);
}
+ private static void ReplaceProjectPropertyTokens(string[] source, TaskLoggingHelper log)
+ {
+ for (var i = 0; i < source.Length; i++)
+ {
+ var splitLine = source[i].Split('$');
+ if (splitLine.Length <= 2)
+ {
+ continue;
+ }
+
+ for (var j = 1; j < splitLine.Length; j += 2)
+ {
+ var token = splitLine[j];
+ if (token.Contains(" "))
+ {
+ // Not a valid token...
+ j--;
+ continue;
+ }
+ var value = CurrentProject.GetPropertyValue(token);
+ log.LogMessage(MessageImportance.Low, "NugetContentRestore :: Replacing token '{0}' with '{1}'", token, value);
+ splitLine[j] = value;
+ }
+ source[i] = string.Join(string.Empty, splitLine);
+ }
+ }
}
}
diff --git a/MSBuild.NugetContentRestore.Tasks/MSBuild.NugetContentRestore.Tasks.csproj b/MSBuild.NugetContentRestore.Tasks/MSBuild.NugetContentRestore.Tasks.csproj
index 4cdb2a4..3754615 100755
--- a/MSBuild.NugetContentRestore.Tasks/MSBuild.NugetContentRestore.Tasks.csproj
+++ b/MSBuild.NugetContentRestore.Tasks/MSBuild.NugetContentRestore.Tasks.csproj
@@ -31,6 +31,7 @@
4
+
diff --git a/MSBuild.NugetContentRestore.Tasks/NugetContentRestoreTask.cs b/MSBuild.NugetContentRestore.Tasks/NugetContentRestoreTask.cs
index 9a6cb1f..e337211 100755
--- a/MSBuild.NugetContentRestore.Tasks/NugetContentRestoreTask.cs
+++ b/MSBuild.NugetContentRestore.Tasks/NugetContentRestoreTask.cs
@@ -18,8 +18,8 @@ public class NugetContentRestoreTask : Task
#region Private Members
- private readonly string[] _folders = new[] { "Scripts", "Images", "fonts", "content" };
- private readonly string[] _ignoreFilePatterns = new[] { "*.transform", "*.install.xdt", "*.pp" };
+ private readonly string[] _folders = new[] { "App_Packages", "Scripts", "Images", "fonts", "content" };
+ private readonly string[] _ignoreFilePatterns = new[] { "*.transform", "*.install.xdt" };
private string _configFileFullPath;
#endregion
@@ -91,26 +91,15 @@ public override bool Execute()
var ignoreFilePatterns = from p in ignoreFilePatternsArray
select new Wildcard(p, RegexOptions.IgnoreCase);
- // Restore Package Content for predefined folders (_folders)
+ // Restore Package Content for predefined folders (Folders) and additional folders (AdditionalFolder)
var filePatterns = ignoreFilePatterns as Wildcard[] ?? ignoreFilePatterns.ToArray();
- foreach (var folder in _folders)
+ foreach (var folder in Folders.Union(AdditionalFolders ?? new string[0] ))
{
var sourceFolderInfo = new DirectoryInfo(Path.Combine(packageContentsFullPath, folder));
if (!sourceFolderInfo.Exists) continue;
Log.LogMessage(MessageImportance.High, "NugetContentRestore :: {0} :: {1} :: Restoring content files", package.FolderName, folder);
- sourceFolderInfo.CopyTo(Path.Combine(ProjectDir, folder), true, filePatterns.ToArray(), EnableSmartRestore);
- }
-
- // Restore Package Content for additional folders (AdditionalFolder)
- if (AdditionalFolders == null) continue;
- foreach (var folder in AdditionalFolders)
- {
- var sourceFolderInfo = new DirectoryInfo(Path.Combine(packageContentsFullPath, folder));
- if (!sourceFolderInfo.Exists) continue;
-
- Log.LogMessage(MessageImportance.High, "NugetContentRestore :: {0} :: {1} :: Restoring content files", package.FolderName, folder);
- sourceFolderInfo.CopyTo(Path.Combine(ProjectDir, folder), true, filePatterns.ToArray(), EnableSmartRestore);
+ sourceFolderInfo.CopyTo(Path.Combine(ProjectDir, folder), true, filePatterns.ToArray(), EnableSmartRestore, BuildEngine3.ProjectFileOfTaskNode, Log);
}
}