Browse Source

Fix EF Add-Migrations not adding migration designer files as dependencies.

Change EnvDTE.ProjectItems.AddFileFromCopy to add .resx and .Designer.cs files to the
project with DependentUpon set to the parent file if a parent file is found in the project.
pull/28/head
Matt Ward 13 years ago
parent
commit
859d3ab9a0
  1. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 92
      src/AddIns/Misc/PackageManagement/Project/Src/DependentFile.cs
  3. 15
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  4. 10
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs
  5. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  6. 163
      src/AddIns/Misc/PackageManagement/Test/Src/DependentFileNameTests.cs
  7. 32
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs

1
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -76,6 +76,7 @@ @@ -76,6 +76,7 @@
<Compile Include="Src\ClassCodeGenerator.cs" />
<Compile Include="Src\ClassKindUpdater.cs" />
<Compile Include="Src\ConfigSettingsFileSystem.cs" />
<Compile Include="Src\DependentFile.cs" />
<Compile Include="Src\Design\DesignTimeSelectProjectsViewModel.cs" />
<Compile Include="Src\Design\FakePackageOperation.cs" />
<Compile Include="Src\Design\FakeProjectBuilder.cs" />

92
src/AddIns/Misc/PackageManagement/Project/Src/DependentFile.cs

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
using System.Linq;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement
{
public class DependentFile
{
IProject project;
public DependentFile(IProject project)
{
this.project = project;
}
public FileProjectItem GetParentFileProjectItem(string fileName)
{
string parentFileName = GetParentFileName(fileName);
if (parentFileName != null) {
return project.FindFile(parentFileName);
}
return null;
}
string GetParentFileName(string fileName)
{
if (IsResxFile(fileName)) {
return GetParentFileNameForResxFile(fileName);
} else if (IsDesignerFile(fileName)) {
return GetParentFileNameForDesignerFile(fileName);
}
return null;
}
bool IsResxFile(string fileName)
{
return HasMatchingFileExtension(".resx", fileName);
}
string GetParentFileNameForResxFile(string fileName)
{
string fileExtension = GetFileExtensionForProjectSourceCodeFiles();
return Path.ChangeExtension(fileName, fileExtension);
}
bool IsDesignerFile(string fileName)
{
string fileNameWithoutPath = Path.GetFileName(fileName);
return GetIndexOfDesignerNameInFileName(fileNameWithoutPath) > 0;
}
int GetIndexOfDesignerNameInFileName(string fileName)
{
return fileName.LastIndexOf(".designer", StringComparison.OrdinalIgnoreCase);
}
string GetParentFileNameForDesignerFile(string fileName)
{
int index = GetIndexOfDesignerNameInFileName(fileName);
return fileName.Substring(0, index) + Path.GetExtension(fileName);
}
string GetFileExtensionForProjectSourceCodeFiles()
{
if (IsVisualBasicProjectFile(project.FileName)) {
return ".vb";
}
return ".cs";
}
bool IsVisualBasicProjectFile(string fileName)
{
return HasMatchingFileExtension(".vbproj", fileName);
}
bool HasMatchingFileExtension(string extension, string fileName)
{
string otherExtension = Path.GetExtension(fileName);
return IsMatchIgnoringCase(extension, otherExtension);
}
bool IsMatchIgnoringCase(string a, string b)
{
return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}
}
}

15
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs

@ -150,15 +150,20 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -150,15 +150,20 @@ namespace ICSharpCode.PackageManagement.EnvDTE
projectService.RemoveProjectItem(MSBuildProject, referenceItem);
}
internal void AddFileProjectItemUsingPathRelativeToProject(string include)
internal ProjectItem AddFileProjectItemUsingFullPath(string path)
{
FileProjectItem fileProjectItem = CreateFileProjectItemUsingPathRelativeToProject(include);
AddProjectItemToMSBuildProject(fileProjectItem);
string dependentUpon = GetDependentUpon(path);
return AddFileProjectItemWithDependentUsingFullPath(path, dependentUpon);
}
internal ProjectItem AddFileProjectItemUsingFullPath(string path)
string GetDependentUpon(string path)
{
return AddFileProjectItemWithDependentUsingFullPath(path, null);
var dependentFile = new DependentFile(MSBuildProject);
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(path);
if (projectItem != null) {
return Path.GetFileName(projectItem.Include);
}
return null;
}
internal ProjectItem AddFileProjectItemWithDependentUsingFullPath(string path, string dependentUpon)

10
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs

@ -33,15 +33,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -33,15 +33,15 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public virtual void AddFromFileCopy(string filePath)
{
string include = GetIncludePathForFileCopy(filePath);
string fileAdded = filePath;
if (IsFileInsideProjectFolder(filePath)) {
ThrowExceptionIfFileDoesNotExist(filePath);
} else {
CopyFileIntoProject(filePath, include);
fileAdded = CopyFileIntoProject(filePath);
}
using (IProjectBrowserUpdater updater = Project.CreateProjectBrowserUpdater()) {
Project.AddFileProjectItemUsingPathRelativeToProject(include);
AddFileProjectItemToProject(fileAdded);
Project.Save();
}
}
@ -79,11 +79,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -79,11 +79,13 @@ namespace ICSharpCode.PackageManagement.EnvDTE
}
}
void CopyFileIntoProject(string fileName, string projectItemInclude)
string CopyFileIntoProject(string fileName)
{
string projectItemInclude = GetIncludePathForFileCopy(fileName);
string newFileName = GetFileNameInProjectFromProjectItemInclude(projectItemInclude);
ThrowExceptionIfFileExists(newFileName);
fileService.CopyFile(fileName, newFileName);
return newFileName;
}
string GetFileNameInProjectFromProjectItemInclude(string projectItemInclude)

1
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -78,6 +78,7 @@ @@ -78,6 +78,7 @@
<Compile Include="Src\ClassCodeGeneratorTests.cs" />
<Compile Include="Src\ClassKindUpdaterTests.cs" />
<Compile Include="Src\CodeGeneratorTests.cs" />
<Compile Include="Src\DependentFileNameTests.cs" />
<Compile Include="Src\EnvDTE\CodeAttribute2Tests.cs" />
<Compile Include="Src\EnvDTE\CodeAttributesTests.cs" />
<Compile Include="Src\EnvDTE\CodeClass2Tests.cs" />

163
src/AddIns/Misc/PackageManagement/Test/Src/DependentFileNameTests.cs

@ -0,0 +1,163 @@ @@ -0,0 +1,163 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.PackageManagement;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests
{
[TestFixture]
public class DependentFileTests
{
TestableProject project;
DependentFile dependentFile;
void CreateCSharpProject(string projectFileName)
{
project = ProjectHelper.CreateTestProject();
project.FileName = projectFileName;
}
FileProjectItem AddFileToProject(string include)
{
return project.AddFile(include);
}
void CreateDependentFile()
{
dependentFile = new DependentFile(project);
}
[Test]
public void GetParentFileProjectItem_ResxFileNameAndCSharpParentFileExistsInProject_ReturnsParentFileProjectItem()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
FileProjectItem expectedProjectItem = AddFileToProject("test.cs");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\test.resx";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.AreEqual(expectedProjectItem, projectItem);
}
[Test]
public void GetParentFileProjectItem_ResxFileNameAndProjectHasNoFiles_ReturnsNull()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\test.resx";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.IsNull(projectItem);
}
[Test]
public void GetParentFileProjectItem_ResxFileNameAndProjectHasOneCSharpFileWithDifferentFileNameToResxFile_ReturnsNull()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
AddFileToProject(@"d:\projects\MyProject\program.cs");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\test.resx";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.IsNull(projectItem);
}
[Test]
public void GetParentFileProjectItem_ResxFileNameAndVisualBasicParentFileExistsInProject_ReturnsParentFileProjectItem()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.vbproj");
FileProjectItem expectedProjectItem = AddFileToProject("test.vb");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\test.resx";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.AreEqual(expectedProjectItem, projectItem);
}
[Test]
public void GetParentFileProjectItem_ResxFileNameAndVisualBasicParentFileExistsInProjectWhenProjectFileExtensionIsInUpperCase_ReturnsParentFileProjectItem()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.VBPROJ");
FileProjectItem expectedProjectItem = AddFileToProject("test.vb");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\test.resx";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.AreEqual(expectedProjectItem, projectItem);
}
[Test]
public void GetParentFileProjectItem_DesignerFileNameAndCSharpParentFileExistsInProject_ReturnsParentFileProjectItem()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
FileProjectItem expectedProjectItem = AddFileToProject("test.cs");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\test.Designer.cs";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.AreEqual(expectedProjectItem, projectItem);
}
[Test]
public void GetParentFileProjectItem_DesignerFileNameInLowerCaseAndCSharpParentFileExistsInProject_ReturnsParentFileProjectItem()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
FileProjectItem expectedProjectItem = AddFileToProject("test.cs");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\test.designer.cs";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.AreEqual(expectedProjectItem, projectItem);
}
[Test]
public void GetParentFileProjectItem_DesignerInFileNameButMissingDot_ReturnsNull()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
AddFileToProject("abc.cs");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\abc2Designer.cs";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.IsNull(projectItem);
}
[Test]
public void GetParentFileProjectItem_DesignerInFolderName_ReturnsNull()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
AddFileToProject("abc.cs");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\abc.Designer\foo.cs";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.IsNull(projectItem);
}
[Test]
public void GetParentFileProjectItem_DesignerInFolderNameAndInFileName_ReturnsMatchingParentProjectItem()
{
CreateCSharpProject(@"d:\projects\MyProject\MyProject.csproj");
FileProjectItem expectedProjectItem = AddFileToProject(@"Form.Designer\abc.cs");
CreateDependentFile();
string fileName = @"d:\projects\MyProject\Form.Designer\abc.Designer.cs";
FileProjectItem projectItem = dependentFile.GetParentFileProjectItem(fileName);
Assert.AreEqual(expectedProjectItem, projectItem);
}
}
}

32
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs

@ -930,5 +930,37 @@ namespace PackageManagement.Tests.EnvDTE @@ -930,5 +930,37 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual("Cannot find file", ex.Message);
Assert.AreEqual(fileName, ex.FileName);
}
[Test]
public void AddFromFileCopy_AddResxFileWhenParentFileExistsInProject_FileIsAddedToProjectAsDependentFile()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\myproject\myproject.csproj";
msbuildProject.AddFile("MainForm.cs");
string fileToAdd = @"d:\projects\myproject\MainForm.resx";
fakeFileService.ExistingFileNames.Add(fileToAdd);
projectItems.AddFromFileCopy(fileToAdd);
FileProjectItem fileItem = msbuildProject.FindFile(fileToAdd);
Assert.AreEqual("MainForm.resx", fileItem.Include);
Assert.AreEqual("MainForm.cs", fileItem.DependentUpon);
}
[Test]
public void AddFromFileCopy_AddDesignerFileInProjectSubFolderWhenParentFileExistsInProject_FileIsAddedToProjectAsDependentFile()
{
CreateProjectItems();
msbuildProject.FileName = @"d:\projects\myproject\myproject.csproj";
msbuildProject.AddFile(@"UI\MainForm.cs");
string fileToAdd = @"d:\projects\myproject\UI\MainForm.Designer.cs";
fakeFileService.ExistingFileNames.Add(fileToAdd);
projectItems.AddFromFileCopy(fileToAdd);
FileProjectItem fileItem = msbuildProject.FindFile(fileToAdd);
Assert.AreEqual(@"UI\MainForm.Designer.cs", fileItem.Include);
Assert.AreEqual("MainForm.cs", fileItem.DependentUpon);
}
}
}

Loading…
Cancel
Save