Skip to content

Commit

Permalink
Submodule context menus: Only show if dir exists
Browse files Browse the repository at this point in the history
  • Loading branch information
gerhardol committed Nov 29, 2020
1 parent 2b51726 commit 8b8f229
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 9 deletions.
1 change: 1 addition & 0 deletions GitUI/CommandsDialogs/FormCommit.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions GitUI/CommandsDialogs/FormCommit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
20 changes: 12 additions & 8 deletions GitUI/CommandsDialogs/RevisionDiffControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -349,32 +349,36 @@ private ContextMenuSelectionInfo GetSelectionInfo()
isAnyItemWorkTree: isAnyWorkTree,
isBareRepository: isBareRepository,
allFilesExist: allFilesExist,
allDirectoriesExist: allDirectoriesExist,
allFilesOrUntrackedDirectoriesExist: allFilesOrUntrackedDirectoriesExist,
isAnyTracked: isAnyTracked,
supportPatches: supportPatches,
isDeleted: isDeleted,
isAnySubmodule: isAnySubmodule);
return selectionInfo;

static (bool allFilesExist, bool allFilesOrUntrackedDirectoriesExist) FileOrUntrackedDirExists(List<FileStatusItem> items, IFullPathResolver fullPathResolver)
static (bool allFilesExist, bool allDirectoriesExist, bool allFilesOrUntrackedDirectoriesExist) FileOrUntrackedDirExists(List<FileStatusItem> 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);
}
}

Expand Down
5 changes: 4 additions & 1 deletion GitUI/CommandsDialogs/RevisionDiffController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public sealed class ContextMenuSelectionInfo
bool isAnyItemWorkTree,
bool isBareRepository,
bool allFilesExist,
bool allDirectoriesExist,
bool allFilesOrUntrackedDirectoriesExist,
bool isAnyTracked,
bool supportPatches,
Expand All @@ -51,6 +52,7 @@ public sealed class ContextMenuSelectionInfo
IsAnyItemWorkTree = isAnyItemWorkTree;
IsBareRepository = isBareRepository;
AllFilesExist = allFilesExist;
AllDirectoriesExist = allDirectoriesExist;
AllFilesOrUntrackedDirectoriesExist = allFilesOrUntrackedDirectoriesExist;
IsAnyTracked = isAnyTracked;
SupportPatches = supportPatches;
Expand All @@ -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; }
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -43,6 +44,7 @@ public void Setup()
isAnyItemWorkTree,
isBareRepository,
allFilesExist,
allDirectoriesExist,
allFilesOrUntrackedDirectoriesExist,
isAnyTracked,
supportPatches,
Expand Down Expand Up @@ -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
}
}

0 comments on commit 8b8f229

Please sign in to comment.