diff options
author | Michael Hutchinson <mhutchinson@novell.com> | 2010-11-04 16:48:36 +0300 |
---|---|---|
committer | Michael Hutchinson <mhutchinson@novell.com> | 2010-11-04 23:11:43 +0300 |
commit | 74896b7e0e83ccacca16ef646b4e24315b72a460 (patch) | |
tree | ebd80a56c300be682fc102053facefc55a7b7dd6 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad | |
parent | e8e1b1cdbe9a3851e71f2b85b34ffa3526fdd1e3 (diff) |
Clean up folder deletion. Should fix #627484
The ProjectFolder deletion code was every hard to follow
and contained unreachable code and redundancies that made
it hard to find bugs like folders not being removed from
the project properly. It's been heaily reworked and should
be more straightforward now.
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs | 95 |
1 files changed, 43 insertions, 52 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs index 1101d74cf5..6e70b2cdd4 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectFolderNodeBuilder.cs @@ -38,6 +38,7 @@ using MonoDevelop.Ide.Commands; using MonoDevelop.Ide.Gui; using MonoDevelop.Components.Commands; using MonoDevelop.Ide.Gui.Components; +using System.Linq; namespace MonoDevelop.Ide.Gui.Pads.ProjectPad { @@ -172,62 +173,52 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad public override void DeleteMultipleItems () { - Set<SolutionEntityItem> projects = new Set<SolutionEntityItem> (); - - ConfirmationMessage confirmMsg = new ConfirmationMessage (); - confirmMsg.ConfirmButton = AlertButton.Delete; - confirmMsg.AllowApplyToAll = CurrentNodes.Length > 1; - + var projects = new HashSet<SolutionEntityItem> (); + + var confirmMsg = new ConfirmationMessage () { + ConfirmButton = AlertButton.Delete, + AllowApplyToAll = CurrentNodes.Length > 1, + }; + foreach (ITreeNavigator node in CurrentNodes) { - ProjectFolder folder = (ProjectFolder) node.DataItem as ProjectFolder; - Project project = folder.Project; - ProjectFile[] files = project != null ? project.Files.GetFilesInPath (folder.Path) : null; + var folder = node.DataItem as ProjectFolder; + var project = folder.Project; - if (files != null && files.Length == 0) { - confirmMsg.Text = GettextCatalog.GetString ("Are you sure you want to permanently delete the folder {0}?", folder.Path); - bool yes = MessageService.Confirm (confirmMsg); - if (!yes) - return; - - bool removeFiles = false; - try { - if (Directory.Exists (folder.Path)) - // Indirect events will remove the files from the project - FileService.DeleteDirectory (folder.Path); - else - removeFiles = true; - } catch (Exception ex) { - MessageService.ShowError (GettextCatalog.GetString ("The folder {0} could not be deleted from disk: {1}", folder.Path, ex.Message)); - removeFiles = true; - } - if (removeFiles && project != null) { - List<ProjectFile> list = new List<ProjectFile>(); - list.AddRange (project.Files.GetFilesInVirtualPath (folder.Path.ToRelative (project.BaseDirectory))); - ProjectFile pf = project.Files.GetFileWithVirtualPath (folder.Path.ToRelative (project.BaseDirectory)); - if (pf != null) list.Add (pf); - foreach (var f in list) - project.Files.Remove (f); - } + confirmMsg.Text = GettextCatalog.GetString ("Are you sure you want to permanently delete folder {0}?", folder.Path); + if (!MessageService.Confirm (confirmMsg)) + continue; + + var folderRelativePath = folder.Path.ToRelative (project.BaseDirectory); + var files = project.Files.GetFilesInVirtualPath (folder.Path).ToList (); + var folderPf = project.Files.GetFileWithVirtualPath (folderRelativePath); + + try { + if (Directory.Exists (folder.Path)) + // Indirect events will remove the files from the project + FileService.DeleteDirectory (folder.Path); + } catch (Exception ex) { + MessageService.ShowError (GettextCatalog.GetString ("The folder {0} could not be deleted from disk: {1}", folder.Path, ex.Message)); } - else { - bool yes = MessageService.Confirm (GettextCatalog.GetString ("Do you really want to remove folder {0}?", folder.Name), AlertButton.Remove); - if (!yes) return; - - ProjectFile[] inParentFolder = project.Files.GetFilesInPath (Path.GetDirectoryName (folder.Path)); - - if (inParentFolder.Length == files.Length) { - // This is the last folder in the parent folder. Make sure we keep - // a reference to the folder, so it is not deleted from the tree. - ProjectFile folderFile = new ProjectFile (Path.GetDirectoryName (folder.Path)); - folderFile.Subtype = Subtype.Directory; - project.Files.Add (folderFile); - } - - foreach (ProjectFile file in files) - project.Files.Remove (file); - - projects.Add (project); + + // even if we removed the directory successfully there may still be link files + // so make sure we remove all the files + foreach (var f in files) + project.Files.Remove (f); + + // also remove the folder's own ProjectFile, if it exists + if (folderPf != null) + project.Files.Remove (folderPf); + + // If it's the last item in the parent folder, make sure we keep a reference to the parent + // folder, so it is not deleted from the tree. + var inParentFolder = project.Files.GetFilesInVirtualPath (folderRelativePath.ParentDirectory); + if (!inParentFolder.Skip (1).Any()) { + project.Files.Add (new ProjectFile (folder.Path.ParentDirectory) { + Subtype = Subtype.Directory, + }); } + + projects.Add (project); } IdeApp.ProjectOperations.Save (projects); } |