From 8b8f229602951b5bdb3d98c75530ecc82b83cb0c Mon Sep 17 00:00:00 2001 From: Gerhard Olsson Date: Sun, 29 Nov 2020 14:51:34 +0100 Subject: [PATCH] Submodule context menus: Only show if dir exists --- GitUI/CommandsDialogs/FormCommit.Designer.cs | 1 + GitUI/CommandsDialogs/FormCommit.cs | 10 ++++++++++ GitUI/CommandsDialogs/RevisionDiffControl.cs | 20 +++++++++++-------- .../CommandsDialogs/RevisionDiffController.cs | 5 ++++- .../RevisionDiffControllerTests.cs | 13 ++++++++++++ 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/GitUI/CommandsDialogs/FormCommit.Designer.cs b/GitUI/CommandsDialogs/FormCommit.Designer.cs index 3caa7f31a78..42d3d50fa06 100644 --- a/GitUI/CommandsDialogs/FormCommit.Designer.cs +++ b/GitUI/CommandsDialogs/FormCommit.Designer.cs @@ -512,6 +512,7 @@ private void InitializeComponent() this.viewHistoryMenuItem}); this.UnstagedSubmoduleContext.Name = "UnstagedSubmoduleContext"; this.UnstagedSubmoduleContext.Size = new System.Drawing.Size(229, 242); + this.UnstagedSubmoduleContext.Opening += UnstagedSubmoduleContext_Opening; // // commitSubmoduleChanges // diff --git a/GitUI/CommandsDialogs/FormCommit.cs b/GitUI/CommandsDialogs/FormCommit.cs index ef40c6f55d3..9ff7615e062 100644 --- a/GitUI/CommandsDialogs/FormCommit.cs +++ b/GitUI/CommandsDialogs/FormCommit.cs @@ -1723,6 +1723,16 @@ private void StagedFileContext_Opening(object sender, System.ComponentModel.Canc stagedEditFileToolStripMenuItem11.Visible = singleFileExists; } + private void UnstagedSubmoduleContext_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + // Separate menu for single submodule items + bool allDirectoriesExist = Directory.Exists(_fullPathResolver.Resolve(Staged?.SelectedGitItem?.Name)); + updateSubmoduleMenuItem.Enabled = allDirectoriesExist; + resetSubmoduleChanges.Enabled = allDirectoriesExist; + stashSubmoduleChangesToolStripMenuItem.Enabled = allDirectoriesExist; + commitSubmoduleChanges.Enabled = allDirectoriesExist; + } + private void Unstaged_Enter(object sender, EnterEventArgs e) { if (_currentFilesList != Unstaged) diff --git a/GitUI/CommandsDialogs/RevisionDiffControl.cs b/GitUI/CommandsDialogs/RevisionDiffControl.cs index e20ba64ee6e..7f4aa9bb3a9 100644 --- a/GitUI/CommandsDialogs/RevisionDiffControl.cs +++ b/GitUI/CommandsDialogs/RevisionDiffControl.cs @@ -338,7 +338,7 @@ private ContextMenuSelectionInfo GetSelectionInfo() bool supportPatches = selectedGitItemCount == 1 && DiffText.HasAnyPatches(); bool isDeleted = selectedItems.Any(item => item.Item.IsDeleted); bool isAnySubmodule = selectedItems.Any(item => item.Item.IsSubmodule); - (bool allFilesExist, bool allFilesOrUntrackedDirectoriesExist) = FileOrUntrackedDirExists(selectedItems, _fullPathResolver); + (bool allFilesExist, bool allDirectoriesExist, bool allFilesOrUntrackedDirectoriesExist) = FileOrUntrackedDirExists(selectedItems, _fullPathResolver); var selectionInfo = new ContextMenuSelectionInfo( selectedRevision: selectedRev, @@ -349,6 +349,7 @@ private ContextMenuSelectionInfo GetSelectionInfo() isAnyItemWorkTree: isAnyWorkTree, isBareRepository: isBareRepository, allFilesExist: allFilesExist, + allDirectoriesExist: allDirectoriesExist, allFilesOrUntrackedDirectoriesExist: allFilesOrUntrackedDirectoriesExist, isAnyTracked: isAnyTracked, supportPatches: supportPatches, @@ -356,25 +357,28 @@ private ContextMenuSelectionInfo GetSelectionInfo() isAnySubmodule: isAnySubmodule); return selectionInfo; - static (bool allFilesExist, bool allFilesOrUntrackedDirectoriesExist) FileOrUntrackedDirExists(List items, IFullPathResolver fullPathResolver) + static (bool allFilesExist, bool allDirectoriesExist, bool allFilesOrUntrackedDirectoriesExist) FileOrUntrackedDirExists(List items, IFullPathResolver fullPathResolver) { bool allFilesExist = items.Any(); - bool allFilesOrUntrackedDirectoriesExist = items.Any(); + bool allDirectoriesExist = allFilesExist; + bool allFilesOrUntrackedDirectoriesExist = allFilesExist; foreach (var item in items) { var path = fullPathResolver.Resolve(item.Item.Name); var fileExists = File.Exists(path); - allFilesExist = allFilesExist && fileExists; - var fileOrUntrackedDirectoryExists = fileExists || (!item.Item.IsTracked && Directory.Exists(path)); - allFilesOrUntrackedDirectoriesExist = allFilesOrUntrackedDirectoriesExist && fileOrUntrackedDirectoryExists; + var directoryExists = Directory.Exists(path); + allFilesExist &= fileExists; + allDirectoriesExist &= directoryExists; + var fileOrUntrackedDirectoryExists = fileExists || (!item.Item.IsTracked && allDirectoriesExist); + allFilesOrUntrackedDirectoriesExist &= fileOrUntrackedDirectoryExists; - if (allFilesExist == false && allFilesOrUntrackedDirectoriesExist == false) + if (!allFilesExist && !allDirectoriesExist && !allFilesOrUntrackedDirectoriesExist) { break; } } - return (allFilesExist, allFilesOrUntrackedDirectoriesExist); + return (allFilesExist, allDirectoriesExist, allFilesOrUntrackedDirectoriesExist); } } diff --git a/GitUI/CommandsDialogs/RevisionDiffController.cs b/GitUI/CommandsDialogs/RevisionDiffController.cs index 226e1c1824c..f92a57d687e 100644 --- a/GitUI/CommandsDialogs/RevisionDiffController.cs +++ b/GitUI/CommandsDialogs/RevisionDiffController.cs @@ -37,6 +37,7 @@ public sealed class ContextMenuSelectionInfo bool isAnyItemWorkTree, bool isBareRepository, bool allFilesExist, + bool allDirectoriesExist, bool allFilesOrUntrackedDirectoriesExist, bool isAnyTracked, bool supportPatches, @@ -51,6 +52,7 @@ public sealed class ContextMenuSelectionInfo IsAnyItemWorkTree = isAnyItemWorkTree; IsBareRepository = isBareRepository; AllFilesExist = allFilesExist; + AllDirectoriesExist = allDirectoriesExist; AllFilesOrUntrackedDirectoriesExist = allFilesOrUntrackedDirectoriesExist; IsAnyTracked = isAnyTracked; SupportPatches = supportPatches; @@ -67,6 +69,7 @@ public sealed class ContextMenuSelectionInfo public bool IsAnyItemWorkTree { get; } public bool IsBareRepository { get; } public bool AllFilesExist { get; } + public bool AllDirectoriesExist { get; } public bool AllFilesOrUntrackedDirectoriesExist { get; } public bool IsAnyTracked { get; } public bool SupportPatches { get; } @@ -130,7 +133,7 @@ public bool ShouldShowMenuUnstage(ContextMenuSelectionInfo selectionInfo) public bool ShouldShowSubmoduleMenus(ContextMenuSelectionInfo selectionInfo) { - return selectionInfo.IsAnySubmodule && selectionInfo.SelectedRevision?.ObjectId == ObjectId.WorkTreeId; + return selectionInfo.IsAnySubmodule && selectionInfo.SelectedRevision?.ObjectId == ObjectId.WorkTreeId && selectionInfo.AllDirectoriesExist; } public bool ShouldShowMenuEditWorkingDirectoryFile(ContextMenuSelectionInfo selectionInfo) diff --git a/UnitTests/GitUI.Tests/CommandsDialogs/RevisionDiffControllerTests.cs b/UnitTests/GitUI.Tests/CommandsDialogs/RevisionDiffControllerTests.cs index fae72c23af2..b497e0bae45 100644 --- a/UnitTests/GitUI.Tests/CommandsDialogs/RevisionDiffControllerTests.cs +++ b/UnitTests/GitUI.Tests/CommandsDialogs/RevisionDiffControllerTests.cs @@ -29,6 +29,7 @@ public void Setup() bool isAnyItemWorkTree = false, bool isBareRepository = false, bool allFilesExist = true, + bool allDirectoriesExist = false, bool allFilesOrUntrackedDirectoriesExist = false, bool isAnyTracked = true, bool supportPatches = true, @@ -43,6 +44,7 @@ public void Setup() isAnyItemWorkTree, isBareRepository, allFilesExist, + allDirectoriesExist, allFilesOrUntrackedDirectoriesExist, isAnyTracked, supportPatches, @@ -320,6 +322,17 @@ public void BrowseDiff_DeleteFile_Index(bool t) _controller.ShouldShowMenuDeleteFile(selectionInfo).Should().Be(t); } + [TestCase(true, true, true)] + [TestCase(true, false, false)] + [TestCase(false, true, false)] + [TestCase(false, false, false)] + public void BrowseDiff_Submodules_WorkTree(bool isAnySubmodule, bool submodulesExist, bool expected) + { + var rev = new GitRevision(ObjectId.WorkTreeId); + var selectionInfo = CreateContextMenuSelectionInfo(rev, isAnySubmodule: isAnySubmodule, allDirectoriesExist: submodulesExist); + _controller.ShouldShowSubmoduleMenus(selectionInfo).Should().Be(expected); + } + #endregion } }