Browse Source

Support getting and setting the project file's CopyToOutputDirectory property via PowerShell script.

pull/15/head
Matt Ward 14 years ago
parent
commit
1c4db6e458
  1. 5
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 12
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IPropertyFactory.cs
  3. 19
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs
  4. 50
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs
  5. 28
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemProperty.cs
  6. 22
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs
  7. 6
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemsInsideDirectory.cs
  8. 53
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectProperty.cs
  9. 22
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectPropertyFactory.cs
  10. 8
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs
  11. 54
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Property.cs
  12. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  13. 80
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs
  14. 3
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/PropertyTests.cs

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

@ -71,11 +71,16 @@ @@ -71,11 +71,16 @@
<Compile Include="Src\AggregateExceptionErrorMessage.cs" />
<Compile Include="Src\Design\FakePackageManagementProject.cs" />
<Compile Include="Src\EnvDTE\DTE.cs" />
<Compile Include="Src\EnvDTE\IPropertyFactory.cs" />
<Compile Include="Src\EnvDTE\ItemOperations.cs" />
<Compile Include="Src\EnvDTE\ProjectItem.cs" />
<Compile Include="Src\EnvDTE\ProjectItemProperty.cs" />
<Compile Include="Src\EnvDTE\ProjectItemPropertyFactory.cs" />
<Compile Include="Src\EnvDTE\ProjectItems.cs" />
<Compile Include="Src\EnvDTE\ProjectItemsInsideDirectory.cs" />
<Compile Include="Src\EnvDTE\ProjectObject.cs" />
<Compile Include="Src\EnvDTE\ProjectProperty.cs" />
<Compile Include="Src\EnvDTE\ProjectPropertyFactory.cs" />
<Compile Include="Src\EnvDTE\Properties.cs" />
<Compile Include="Src\EnvDTE\Property.cs" />
<Compile Include="Src\EnvDTE\Reference.cs" />

12
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IPropertyFactory.cs

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
// 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;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public interface IPropertyFactory
{
Property CreateProperty(string name);
}
}

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

@ -31,11 +31,17 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -31,11 +31,17 @@ namespace ICSharpCode.PackageManagement.EnvDTE
this.projectService = projectService;
this.fileService = fileService;
CreateProperties();
Object = new ProjectObject(this);
Properties = new Properties(this);
ProjectItems = new ProjectItems(this, fileService);
}
void CreateProperties()
{
var propertyFactory = new ProjectPropertyFactory(this);
Properties = new Properties(propertyFactory);
}
public string Name {
get { return MSBuildProject.Name; }
}
@ -102,14 +108,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -102,14 +108,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE
FileProjectItem CreateFileProjectItem(string include)
{
ItemType itemType = GetDefaultItemType(include);
var fileProjectItem = new FileProjectItem(MSBuildProject, itemType);
fileProjectItem.Include = include;
return fileProjectItem;
return CreateFileProjectItem(itemType, include);
}
ItemType GetDefaultItemType(string include)
{
return MSBuildProject.GetDefaultItemType(include);
}
FileProjectItem CreateFileProjectItem(ItemType itemType, string include)
{
var fileProjectItem = new FileProjectItem(MSBuildProject, itemType);
fileProjectItem.Include = include;
return fileProjectItem;
}
}
}

50
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs

@ -2,22 +2,68 @@ @@ -2,22 +2,68 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ComponentModel;
using System.IO;
using SD = ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectItem
{
SD.ProjectItem projectItem;
SD.FileProjectItem projectItem;
const string CopyToOutputDirectoryPropertyName = "CopyToOutputDirectory";
public ProjectItem(SD.ProjectItem projectItem)
public ProjectItem(Project project, SD.FileProjectItem projectItem)
{
this.projectItem = projectItem;
this.ContainingProject = project;
CreateProperties();
}
void CreateProperties()
{
var propertyFactory = new ProjectItemPropertyFactory(this);
Properties = new Properties(propertyFactory);
}
public string Name {
get { return Path.GetFileName(projectItem.Include); }
}
public Properties Properties { get; private set; }
public Project ContainingProject { get; private set; }
internal object GetProperty(string name)
{
if (name == CopyToOutputDirectoryPropertyName) {
return GetCopyToOutputDirectory();
}
return String.Empty;
}
UInt32 GetCopyToOutputDirectory()
{
return (UInt32)projectItem.CopyToOutputDirectory;
}
internal void SetProperty(string name, object value)
{
if (name == CopyToOutputDirectoryPropertyName) {
SetCopyToOutputDirectory(value);
}
}
void SetCopyToOutputDirectory(object value)
{
SD.CopyToOutputDirectory copyToOutputDirectory = ConvertToCopyToOutputDirectory(value);
projectItem.CopyToOutputDirectory = copyToOutputDirectory;
}
SD.CopyToOutputDirectory ConvertToCopyToOutputDirectory(object value)
{
string valueAsString = value.ToString();
return (SD.CopyToOutputDirectory)Enum.Parse(typeof(SD.CopyToOutputDirectory), valueAsString);
}
}
}

28
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemProperty.cs

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
// 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;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectItemProperty : Property
{
ProjectItem projectItem;
public ProjectItemProperty(ProjectItem projectItem, string name)
: base(projectItem.ContainingProject, name)
{
this.projectItem = projectItem;
}
protected override object GetProperty()
{
return projectItem.GetProperty(Name);
}
protected override void SetProperty(object value)
{
projectItem.SetProperty(Name, value);
}
}
}

22
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemPropertyFactory.cs

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
// 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;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectItemPropertyFactory : IPropertyFactory
{
ProjectItem projectItem;
public ProjectItemPropertyFactory(ProjectItem projectItem)
{
this.projectItem = projectItem;
}
public Property CreateProperty(string name)
{
return new ProjectItemProperty(projectItem, name);
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItemsInsideDirectory.cs

@ -45,7 +45,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -45,7 +45,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
if (IsDirectory(fileItem)) {
return CreateDirectoryProjectItemIfDirectoryNotAlreadyIncluded(fileItem);
}
return new ProjectItem(fileItem);
return new ProjectItem(project, fileItem);
}
return ConvertDirectoryToProjectItem(fileItem);
}
@ -74,7 +74,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -74,7 +74,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
string directory = fileItem.Include;
if (!IsDirectoryIncludedAlready(directory)) {
AddIncludedDirectory(directory);
return new ProjectItem(fileItem);
return new ProjectItem(project, fileItem);
}
return null;
}
@ -116,7 +116,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -116,7 +116,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
var directoryItem = new SD.FileProjectItem(project.MSBuildProject, SD.ItemType.Folder);
directoryItem.Include = directoryName;
return new ProjectItem(directoryItem);
return new ProjectItem(project, directoryItem);
}
string GetFirstSubDirectoryName(string include)

53
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectProperty.cs

@ -0,0 +1,53 @@ @@ -0,0 +1,53 @@
// 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;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectProperty : Property
{
public ProjectProperty(Project project, string name)
: base(project, name)
{
}
protected override object GetProperty()
{
string value = Project.MSBuildProject.GetUnevalatedProperty(Name);
if (value != null) {
return value;
}
if (IsTargetFrameworkMoniker(Name)) {
return GetTargetFrameworkMoniker();
}
return EmptyStringIfNull(value);
}
bool IsTargetFrameworkMoniker(string name)
{
return String.Equals(name, "TargetFrameworkMoniker", StringComparison.InvariantCultureIgnoreCase);
}
string GetTargetFrameworkMoniker()
{
var targetFramework = new ProjectTargetFramework(Project.MSBuildProject);
return targetFramework.TargetFrameworkName.ToString();
}
string EmptyStringIfNull(string value)
{
if (value != null) {
return value;
}
return String.Empty;
}
protected override void SetProperty(object value)
{
bool escapeValue = false;
Project.MSBuildProject.SetProperty(Name, value as string, escapeValue);
}
}
}

22
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectPropertyFactory.cs

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
// 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;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public class ProjectPropertyFactory : IPropertyFactory
{
Project project;
public ProjectPropertyFactory(Project project)
{
this.project = project;
}
public Property CreateProperty(string name)
{
return new ProjectProperty(project, name);
}
}
}

8
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Properties.cs

@ -8,16 +8,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -8,16 +8,16 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class Properties
{
Project project;
IPropertyFactory propertyFactory;
public Properties(Project project)
public Properties(IPropertyFactory propertyFactory)
{
this.project = project;
this.propertyFactory = propertyFactory;
}
public Property Item(string propertyName)
{
return new Property(project, propertyName);
return propertyFactory.CreateProperty(propertyName);
}
}
}

54
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Property.cs

@ -8,59 +8,31 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -8,59 +8,31 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class Property
{
Project project;
string name;
public Property(Project project, string name)
{
this.project = project;
this.name = name;
this.Project = project;
this.Name = name;
}
public object Value {
get { return GetProperty(name); }
set {
SetProperty(name, value);
project.Save();
}
}
public string Name { get; private set; }
string GetProperty(string name)
{
string value = project.MSBuildProject.GetUnevalatedProperty(name);
if (value != null) {
return value;
}
if (IsTargetFrameworkMoniker(name)) {
return GetTargetFrameworkMoniker();
}
return EmptyStringIfNull(value);
}
protected Project Project { get; private set; }
bool IsTargetFrameworkMoniker(string name)
{
return String.Equals(name, "TargetFrameworkMoniker", StringComparison.InvariantCultureIgnoreCase);
}
string GetTargetFrameworkMoniker()
{
var targetFramework = new ProjectTargetFramework(project.MSBuildProject);
return targetFramework.TargetFrameworkName.ToString();
public virtual object Value {
get { return GetProperty(); }
set {
SetProperty(value);
Project.Save();
}
}
string EmptyStringIfNull(string value)
protected virtual object GetProperty()
{
if (value != null) {
return value;
}
return String.Empty;
return null;
}
void SetProperty(string name, object value)
protected virtual void SetProperty(object value)
{
bool escapeValue = false;
project.MSBuildProject.SetProperty(name, value as string, escapeValue);
}
}
}

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

@ -72,6 +72,7 @@ @@ -72,6 +72,7 @@
<Compile Include="Src\AddPackageReferenceCommandTests.cs" />
<Compile Include="Src\EnvDTE\DTETests.cs" />
<Compile Include="Src\EnvDTE\ItemOperationsTests.cs" />
<Compile Include="Src\EnvDTE\ProjectItemPropertyTests.cs" />
<Compile Include="Src\EnvDTE\ProjectItemsTests.cs" />
<Compile Include="Src\EnvDTE\ProjectTests.cs" />
<Compile Include="Src\EnvDTE\PropertyTests.cs" />

80
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemPropertyTests.cs

@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
// 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.EnvDTE;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
using SD = ICSharpCode.SharpDevelop.Project;
namespace PackageManagement.Tests.EnvDTE
{
[TestFixture]
public class ProjectItemPropertyTests
{
ProjectItem projectItem;
SD.FileProjectItem msbuildFileProjectItem;
TestableDTEProject project;
TestableProject msbuildProject;
Properties properties;
void CreateProjectItemProperties()
{
project = new TestableDTEProject();
msbuildProject = project.TestableProject;
msbuildFileProjectItem = new SD.FileProjectItem(msbuildProject, SD.ItemType.Compile);
projectItem = new ProjectItem(project, msbuildFileProjectItem);
properties = projectItem.Properties;
}
[Test]
public void Value_GetCopyToOutputDirectoryPropertyValue_ReturnsCopyToOutputDirectoryValueFromMSBuildProject()
{
CreateProjectItemProperties();
msbuildFileProjectItem.CopyToOutputDirectory = SD.CopyToOutputDirectory.PreserveNewest;
var propertyObject = properties.Item("CopyToOutputDirectory").Value;
var propertyValue = (UInt32)propertyObject;
var propertyValueAsEnum = (SD.CopyToOutputDirectory)propertyValue;
Assert.AreEqual(SD.CopyToOutputDirectory.PreserveNewest, propertyValueAsEnum);
}
[Test]
public void Name_ProjectItemNameIsTest_ReturnsTest()
{
CreateProjectItemProperties();
var property = new ProjectItemProperty(projectItem, "Test");
string name = property.Name;
Assert.AreEqual("Test", name);
}
[Test]
public void Value_SetCopyToOutputDirectoryPropertyValueToAlways_SetsCopyToOutputDirectoryValueInMSBuildProject()
{
CreateProjectItemProperties();
UInt32 copyToOutputDirectoryAlways = 1;
properties.Item("CopyToOutputDirectory").Value = copyToOutputDirectoryAlways;
var copyToOutputDirectory = msbuildFileProjectItem.CopyToOutputDirectory;
Assert.AreEqual(SD.CopyToOutputDirectory.Always, copyToOutputDirectory);
}
[Test]
public void Value_SetCopyToOutputDirectoryPropertyValueToAlways_ProjectIsSaved()
{
CreateProjectItemProperties();
UInt32 copyToOutputDirectoryAlways = 1;
properties.Item("CopyToOutputDirectory").Value = copyToOutputDirectoryAlways;
bool saved = msbuildProject.IsSaved;
Assert.IsTrue(saved);
}
}
}

3
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/PropertyTests.cs

@ -19,7 +19,8 @@ namespace PackageManagement.Tests.EnvDTE @@ -19,7 +19,8 @@ namespace PackageManagement.Tests.EnvDTE
{
project = new TestableDTEProject();
msbuildProject = project.TestableProject;
properties = new Properties(project);
var factory = new ProjectPropertyFactory(project);
properties = new Properties(factory);
}
[Test]

Loading…
Cancel
Save