Skip to content

Commit aab53e4

Browse files
authored
Merge pull request #442 from tonyhallett/restore-project-file-when-removing-runsettings
Save project file removes from git changes
2 parents e31d853 + 6ba4bcc commit aab53e4

File tree

3 files changed

+54
-5
lines changed

3 files changed

+54
-5
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Microsoft;
2+
using Microsoft.VisualStudio;
3+
using Microsoft.VisualStudio.Shell;
4+
using Microsoft.VisualStudio.Shell.Interop;
5+
using System;
6+
using System.ComponentModel.Composition;
7+
8+
namespace FineCodeCoverage.Core.MsTestPlatform.CodeCoverage
9+
{
10+
interface IProjectSaver
11+
{
12+
void SaveProject(IVsHierarchy projectHierarchy);
13+
}
14+
15+
[Export(typeof(IProjectSaver))]
16+
internal class ProjectSaver : IProjectSaver
17+
{
18+
private IServiceProvider serviceProvider;
19+
20+
[ImportingConstructor]
21+
public ProjectSaver(
22+
[Import(typeof(SVsServiceProvider))]
23+
IServiceProvider serviceProvider
24+
)
25+
{
26+
this.serviceProvider = serviceProvider;
27+
}
28+
29+
public void SaveProject(IVsHierarchy projectHierarchy)
30+
{
31+
ThreadHelper.ThrowIfNotOnUIThread();
32+
var _solution = (IVsSolution)serviceProvider.GetService(typeof(SVsSolution));
33+
Assumes.Present(_solution);
34+
int hr = _solution.SaveSolutionElement((uint)__VSSLNSAVEOPTIONS.SLNSAVEOPT_SaveIfDirty, projectHierarchy, 0);
35+
if (ErrorHandler.Failed(hr))
36+
{
37+
}
38+
}
39+
}
40+
}

SharedProject/Core/MsTestPlatform/CodeCoverage/VsRunSettingsWriter.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
using Microsoft.VisualStudio.Shell.Interop;
55
using System;
66
using System.ComponentModel.Composition;
7-
using Task = System.Threading.Tasks.Task;
87
using System.Threading.Tasks;
8+
using FineCodeCoverage.Core.MsTestPlatform.CodeCoverage;
99

1010
namespace FineCodeCoverage.Engine.MsTestPlatform.CodeCoverage
1111
{
@@ -14,14 +14,17 @@ internal class VsRunSettingsWriter : IVsRunSettingsWriter
1414
{
1515
private const string projectRunSettingsFilePathElementName = "RunSettingsFilePath";
1616
private readonly IServiceProvider serviceProvider;
17+
private readonly IProjectSaver projectSaver;
1718

1819
[ImportingConstructor]
1920
public VsRunSettingsWriter(
2021
[Import(typeof(SVsServiceProvider))]
21-
IServiceProvider serviceProvider
22+
IServiceProvider serviceProvider,
23+
IProjectSaver projectSaver
2224
)
2325
{
2426
this.serviceProvider = serviceProvider;
27+
this.projectSaver = projectSaver;
2528
}
2629

2730
public async Task<bool> WriteRunSettingsFilePathAsync(Guid projectGuid, string projectRunSettingsFilePath)
@@ -34,15 +37,15 @@ public async Task<bool> WriteRunSettingsFilePathAsync(Guid projectGuid, string p
3437
{
3538
if (vsHierarchy is IVsBuildPropertyStorage vsBuildPropertyStorage)
3639
{
37-
// care not to use 2 !
38-
success = vsBuildPropertyStorage.SetPropertyValue(projectRunSettingsFilePathElementName, null, 1, projectRunSettingsFilePath) == VSConstants.S_OK;
40+
success = vsBuildPropertyStorage.SetPropertyValue(projectRunSettingsFilePathElementName, string.Empty, (uint)_PersistStorageType.PST_PROJECT_FILE, projectRunSettingsFilePath) == VSConstants.S_OK;
3941
}
4042
}
4143
return success;
4244
}
4345

4446
public async Task<bool> RemoveRunSettingsFilePathAsync(Guid projectGuid)
4547
{
48+
4649
var ok = false;
4750
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
4851
var vsSolution = serviceProvider.GetService(typeof(SVsSolution)) as IVsSolution;
@@ -51,7 +54,12 @@ public async Task<bool> RemoveRunSettingsFilePathAsync(Guid projectGuid)
5154
{
5255
if (vsHierarchy is IVsBuildPropertyStorage vsBuildPropertyStorage)
5356
{
54-
ok = vsBuildPropertyStorage.RemoveProperty(projectRunSettingsFilePathElementName, null, 1) == VSConstants.S_OK;
57+
ok = vsBuildPropertyStorage.RemoveProperty(projectRunSettingsFilePathElementName, string.Empty, (uint)_PersistStorageType.PST_PROJECT_FILE) == VSConstants.S_OK;
58+
59+
if (ok)
60+
{
61+
this.projectSaver.SaveProject(vsHierarchy);
62+
}
5563
}
5664
}
5765
return ok;

SharedProject/SharedProject.projitems

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
<Compile Include="$(MSBuildThisFileDirectory)Core\Model\VsBuildFCCSettingsProvider.cs" />
9595
<Compile Include="$(MSBuildThisFileDirectory)Core\MsTestPlatform\CodeCoverage\ITemplatedRunSettingsService.cs" />
9696
<Compile Include="$(MSBuildThisFileDirectory)Core\MsTestPlatform\CodeCoverage\MsTemplateReplacementException.cs" />
97+
<Compile Include="$(MSBuildThisFileDirectory)Core\MsTestPlatform\CodeCoverage\ProjectSaver.cs" />
9798
<Compile Include="$(MSBuildThisFileDirectory)Core\MsTestPlatform\CodeCoverage\RunSettingsTemplate.cs" />
9899
<Compile Include="$(MSBuildThisFileDirectory)Core\MsTestPlatform\CodeCoverage\CustomRunSettingsTemplateProvider.cs" />
99100
<Compile Include="$(MSBuildThisFileDirectory)Core\MsTestPlatform\CodeCoverage\IRunSettingsTemplate.cs" />

0 commit comments

Comments
 (0)