Do not add duplicate solution folders or project directories (#5377)

* Do not add duplicate solution folders or project directories

* Fix the algorithm for removing empty solution folders

* Improving code by adding description methods. To address PR comments.
This commit is contained in:
Justin Goshi 2017-01-20 16:34:37 -10:00 committed by Piotr Puszkiewicz
parent 6bb76cf20e
commit b2c51b7269
10 changed files with 270 additions and 70 deletions

View file

@ -126,10 +126,8 @@ namespace Microsoft.DotNet.Tools.Sln.Remove
private void RemoveEmptySolutionFolders(SlnFile slnFile)
{
var referencedSolutionFolders = slnFile.Projects.GetReferencedSolutionFolders();
var solutionFolderProjects = slnFile.Projects
.Where(p => p.TypeGuid == ProjectTypeGuids.SolutionFolderGuid)
.GetProjectsByType(ProjectTypeGuids.SolutionFolderGuid)
.ToList();
if (solutionFolderProjects.Any())
@ -138,9 +136,13 @@ namespace Microsoft.DotNet.Tools.Sln.Remove
"NestedProjects",
SlnSectionType.PreProcess);
var solutionFoldersInUse = GetSolutionFoldersThatContainProjectsInItsHierarchy(
slnFile,
nestedProjectsSection.Properties);
foreach (var solutionFolderProject in solutionFolderProjects)
{
if (!referencedSolutionFolders.Contains(solutionFolderProject.Name))
if (!solutionFoldersInUse.Contains(solutionFolderProject.Id))
{
slnFile.Projects.Remove(solutionFolderProject);
nestedProjectsSection.Properties.Remove(solutionFolderProject.Id);
@ -153,5 +155,27 @@ namespace Microsoft.DotNet.Tools.Sln.Remove
}
}
}
private HashSet<string> GetSolutionFoldersThatContainProjectsInItsHierarchy(
SlnFile slnFile,
SlnPropertySet nestedProjects)
{
var solutionFoldersInUse = new HashSet<string>();
var nonSolutionFolderProjects = slnFile.Projects.GetProjectsNotOfType(
ProjectTypeGuids.SolutionFolderGuid);
foreach (var nonSolutionFolderProject in nonSolutionFolderProjects)
{
var id = nonSolutionFolderProject.Id;
while (nestedProjects.ContainsKey(id))
{
id = nestedProjects[id];
solutionFoldersInUse.Add(id);
}
}
return solutionFoldersInUse;
}
}
}