From 88d645b64e1ac11156f7c91178bfc91a6d76f919 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 28 Jul 2012 11:25:01 +0100 Subject: [PATCH] Fix custom scaffolder unable to file scaffolding powershell file. --- .../Src/EnvDTE/DirectoryProjectItem.cs | 13 +++---- .../Project/Src/EnvDTE/ProjectItem.cs | 8 +++-- .../Src/EnvDTE/ProjectItemRelationship.cs | 24 +++++++++---- .../Test/Src/EnvDTE/ProjectItemsTests.cs | 35 +++++++++++++++++++ 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/DirectoryProjectItem.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/DirectoryProjectItem.cs index 7fa69c7362..6ceba4ed7d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/DirectoryProjectItem.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/DirectoryProjectItem.cs @@ -3,6 +3,8 @@ using System; using System.IO; +using System.Linq; + using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Project; using SD = ICSharpCode.SharpDevelop.Project; @@ -23,17 +25,12 @@ namespace ICSharpCode.PackageManagement.EnvDTE static FileProjectItem CreateFileProjectItem(Project project, string relativePath) { - string directory = GetLastDirectoryName(relativePath); - return new FileProjectItem(project.MSBuildProject, ItemType.Folder, directory); + return new FileProjectItem(project.MSBuildProject, ItemType.Folder, relativePath); } - static string GetLastDirectoryName(string relativePath) + static string GetSubdirectoryName(string relativePath) { -// string[] directoryNames = relativePath.Split('\\'); -// if (directoryNames.Length > 1) { -// return directoryNames[1]; -// } - return relativePath; + return relativePath.Split('\\').First(); } public DirectoryProjectItem(Project project, FileProjectItem projectItem) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs index 2ad9b9ff6a..251fd4d0c2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs @@ -141,9 +141,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE internal string GetIncludePath(string fileName) { - string parentFileName = (string)GetProperty(FullPathPropertyName); - string relativeDirectory = ContainingProject.GetRelativePath(parentFileName); + string relativeDirectory = ContainingProject.GetRelativePath(projectItem.FileName); return Path.Combine(relativeDirectory, fileName); } + + internal string GetIncludePath() + { + return projectItem.Include; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemRelationship.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemRelationship.cs index aa1afabf05..f679f52bab 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemRelationship.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemRelationship.cs @@ -3,6 +3,8 @@ using System; using System.IO; +using System.Linq; +using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Project; using SD = ICSharpCode.SharpDevelop.Project; @@ -10,15 +12,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public class ProjectItemRelationship { - public ProjectItemRelationship(ProjectItem projectItem, SD.ProjectItem msbuildProjectItem) + public ProjectItemRelationship(ProjectItem parentProjectItem, SD.ProjectItem msbuildProjectItem) { - this.ProjectItem = projectItem; + this.ParentProjectItem = parentProjectItem; this.MSBuildProjectItem = msbuildProjectItem; - this.Project = projectItem.ContainingProject; + this.Project = parentProjectItem.ContainingProject; GetRelationship(); } - public ProjectItem ProjectItem { get; private set; } + public ProjectItem ParentProjectItem { get; private set; } public SD.ProjectItem MSBuildProjectItem { get; private set; } public Project Project { get; private set; } @@ -48,7 +50,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE bool IsChildItem() { - return ProjectItem.IsChildItem(MSBuildProjectItem); + return ParentProjectItem.IsChildItem(MSBuildProjectItem); } ProjectItem CreateProjectItem() @@ -58,12 +60,20 @@ namespace ICSharpCode.PackageManagement.EnvDTE bool IsInChildDirectory() { - return MSBuildProjectItemDirectory.StartsWith(ProjectItem.Name); + return MSBuildProjectItemDirectory.StartsWith(ParentProjectItem.GetIncludePath()); } ProjectItem CreateDirectoryItem() { - return new DirectoryProjectItem(Project, MSBuildProjectItemDirectory); + string relativePath = GetPathOneDirectoryBelowParentProjectItem(); + return new DirectoryProjectItem(Project, relativePath); + } + + string GetPathOneDirectoryBelowParentProjectItem() + { + string[] parentDirectories = ParentProjectItem.GetIncludePath().Split('\\'); + string[] directories = MSBuildProjectItemDirectory.Split('\\'); + return String.Join(@"\", directories.Take(parentDirectories.Length + 1).ToArray()); } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs index c1448ec115..804b77da8c 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs @@ -64,6 +64,11 @@ namespace PackageManagement.Tests.EnvDTE .SingleOrDefault(item => item.Name == name); } + DTE.ProjectItem GetFirstChildItem(ProjectItems projectItems) + { + return projectItems.OfType().FirstOrDefault(); + } + [Test] public void AddFromFileCopy_AddFileNameOutsideProjectFolder_FileIsIncludedInProjectInProjectFolder() { @@ -688,5 +693,35 @@ namespace PackageManagement.Tests.EnvDTE string expectedDirectory = @"d:\projects\MyProject\CodeTemplates\Scaffolders"; Assert.AreEqual(expectedDirectory, directory); } + + [Test] + public void GetEnumerator_ProjectHasOneFileInFolderThreeLevelsDeep_FileReturnedInProjectItems() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\MyProject\MyProject.csproj"; + msbuildProject.AddFile(@"CodeTemplates\Scaffolders\jQueryPlugin\jQueryPlugin.ps1"); + DTE.ProjectItem codeTemplatesFolderItem = GetChildItem(projectItems, "CodeTemplates"); + DTE.ProjectItem scaffolderFolderItem = GetChildItem(codeTemplatesFolderItem.ProjectItems, "Scaffolders"); + DTE.ProjectItem jqueryPluginFolderItem = GetChildItem(scaffolderFolderItem.ProjectItems, "jQueryPlugin"); + + DTE.ProjectItem jqueryPluginFileItem = GetFirstChildItem(jqueryPluginFolderItem.ProjectItems); + + Assert.AreEqual("jQueryPlugin.ps1", jqueryPluginFileItem.Name); + } + + [Test] + public void Item_GetFileProjectItemByNameWhenProjectHasOneFileInFolderThreeLevelsDeep_ReturnsFileProjectItem() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\MyProject\MyProject.csproj"; + msbuildProject.AddFile(@"CodeTemplates\Scaffolders\jQueryPlugin\jQueryPlugin.ps1"); + DTE.ProjectItem codeTemplatesFolderItem = GetChildItem(projectItems, "CodeTemplates"); + DTE.ProjectItem scaffolderFolderItem = GetChildItem(codeTemplatesFolderItem.ProjectItems, "Scaffolders"); + DTE.ProjectItem jqueryPluginFolderItem = GetChildItem(scaffolderFolderItem.ProjectItems, "jQueryPlugin"); + + DTE.ProjectItem jqueryPluginFileItem = jqueryPluginFolderItem.ProjectItems.Item("jQueryPlugin.ps1"); + + Assert.AreEqual("jQueryPlugin.ps1", jqueryPluginFileItem.Name); + } } }