private void ContextMenuOpening(object sender, CancelEventArgs e)
{
if (Revisions.RowCount < LastRowIndex || LastRowIndex < 0 || Revisions.RowCount == 0)
return;
var inTheMiddleOfBisect = Module.InTheMiddleOfBisect();
markRevisionAsBadToolStripMenuItem.Visible = inTheMiddleOfBisect;
markRevisionAsGoodToolStripMenuItem.Visible = inTheMiddleOfBisect;
bisectSkipRevisionToolStripMenuItem.Visible = inTheMiddleOfBisect;
stopBisectToolStripMenuItem.Visible = inTheMiddleOfBisect;
bisectSeparator.Visible = inTheMiddleOfBisect;
compareWithCurrentBranchToolStripMenuItem.Visible = Module.GetSelectedBranch().IsNotNullOrWhitespace();
var revision = GetRevision(LastRowIndex);
var deleteTagDropDown = new ContextMenuStrip();
var deleteBranchDropDown = new ContextMenuStrip();
var checkoutBranchDropDown = new ContextMenuStrip();
var mergeBranchDropDown = new ContextMenuStrip();
var rebaseDropDown = new ContextMenuStrip();
var renameDropDown = new ContextMenuStrip();
var gitRefListsForRevision = new GitRefListsForRevision(revision);
ISet<string> ambiguosuRefs = GitRef.GetAmbiguousRefNames(LatestRefs);
Func<IGitRef, string> getRefUnambiguousName = (IGitRef gitRef) =>
{
if (ambiguosuRefs.Contains(gitRef.Name))
{
return gitRef.CompleteName;
}
return gitRef.Name;
};
foreach (var head in gitRefListsForRevision.AllTags)
{
ToolStripItem toolStripItem = new ToolStripMenuItem(head.Name);
toolStripItem.Tag = head.Name;
toolStripItem.Click += ToolStripItemClickDeleteTag;
deleteTagDropDown.Items.Add(toolStripItem);
toolStripItem = new ToolStripMenuItem(head.Name);
toolStripItem.Tag = getRefUnambiguousName(head);
toolStripItem.Click += ToolStripItemClickMergeBranch;
mergeBranchDropDown.Items.Add(toolStripItem);
}
//For now there is no action that could be done on currentBranch
bool bareRepository = Module.IsBareRepository();
string currentBranch = Module.GetSelectedBranch();
var allBranches = gitRefListsForRevision.AllBranches;
var branchesWithNoIdenticalRemotes = gitRefListsForRevision.BranchesWithNoIdenticalRemotes;
bool currentBranchPointsToRevision = false;
foreach (var head in branchesWithNoIdenticalRemotes)
{
if (head.Name.Equals(currentBranch))
currentBranchPointsToRevision = true;
else
{
ToolStripItem toolStripItem = new ToolStripMenuItem(head.Name);
toolStripItem.Tag = getRefUnambiguousName(head);
toolStripItem.Click += ToolStripItemClickMergeBranch;
mergeBranchDropDown.Items.Add(toolStripItem);
toolStripItem = new ToolStripMenuItem(head.Name);
toolStripItem.Tag = getRefUnambiguousName(head);
toolStripItem.Click += ToolStripItemClickRebaseBranch;
rebaseDropDown.Items.Add(toolStripItem);
}
}
//if there is no branch to rebase on, then allow user to rebase on selected commit
if (rebaseDropDown.Items.Count == 0 && !currentBranchPointsToRevision)
{
ToolStripItem toolStripItem = new ToolStripMenuItem(revision.Guid);
toolStripItem.Tag = revision.Guid;
toolStripItem.Click += ToolStripItemClickRebaseBranch;
rebaseDropDown.Items.Add(toolStripItem);
}
//if there is no branch to merge, then let user to merge selected commit into current branch
if (mergeBranchDropDown.Items.Count == 0 && !currentBranchPointsToRevision)
{
ToolStripItem toolStripItem = new ToolStripMenuItem(revision.Guid);
toolStripItem.Tag = revision.Guid;
toolStripItem.Click += ToolStripItemClickMergeBranch;
mergeBranchDropDown.Items.Add(toolStripItem);
}
// clipboard branch and tag menu handling
{
branchNameCopyToolStripMenuItem.Tag = "caption";
tagNameCopyToolStripMenuItem.Tag = "caption";
MenuUtil.SetAsCaptionMenuItem(branchNameCopyToolStripMenuItem, mainContextMenu);
MenuUtil.SetAsCaptionMenuItem(tagNameCopyToolStripMenuItem, mainContextMenu);
var branchNames = gitRefListsForRevision.GetAllBranchNames();
CopyToClipboardMenuHelper.SetCopyToClipboardMenuItems(
copyToClipboardToolStripMenuItem, branchNameCopyToolStripMenuItem, branchNames, "branchNameItem");
var tagNames = gitRefListsForRevision.GetAllTagNames();
CopyToClipboardMenuHelper.SetCopyToClipboardMenuItems(
copyToClipboardToolStripMenuItem, tagNameCopyToolStripMenuItem, tagNames, "tagNameItem");
toolStripSeparator6.Visible = branchNames.Any() || tagNames.Any();
}
foreach (var head in allBranches)
{
ToolStripItem toolStripItem = new ToolStripMenuItem(head.Name);
//skip remote branches - they can not be deleted this way
if (!head.IsRemote)
{
if (!head.Name.Equals(currentBranch))
{
toolStripItem = new ToolStripMenuItem(head.Name);
toolStripItem.Tag = head.Name;
toolStripItem.Click += ToolStripItemClickDeleteBranch;
deleteBranchDropDown.Items.Add(toolStripItem); //Add to delete branch
}
toolStripItem = new ToolStripMenuItem(head.Name);
toolStripItem.Tag = head.Name;
toolStripItem.Click += ToolStripItemClickRenameBranch;
renameDropDown.Items.Add(toolStripItem); //Add to rename branch
}
if (!head.Name.Equals(currentBranch))
{
toolStripItem = new ToolStripMenuItem(head.Name);
if (head.IsRemote)
toolStripItem.Click += ToolStripItemClickCheckoutRemoteBranch;
else
toolStripItem.Click += ToolStripItemClickCheckoutBranch;
checkoutBranchDropDown.Items.Add(toolStripItem);
}
}
deleteTagToolStripMenuItem.DropDown = deleteTagDropDown;
deleteTagToolStripMenuItem.Enabled = deleteTagDropDown.Items.Count > 0;
deleteBranchToolStripMenuItem.DropDown = deleteBranchDropDown;
deleteBranchToolStripMenuItem.Enabled = deleteBranchDropDown.Items.Count > 0;
checkoutBranchToolStripMenuItem.DropDown = checkoutBranchDropDown;
checkoutBranchToolStripMenuItem.Enabled = !bareRepository && checkoutBranchDropDown.Items.Count > 0;
mergeBranchToolStripMenuItem.DropDown = mergeBranchDropDown;
mergeBranchToolStripMenuItem.Enabled = !bareRepository && mergeBranchDropDown.Items.Count > 0;
rebaseOnToolStripMenuItem.DropDown = rebaseDropDown;
rebaseOnToolStripMenuItem.Enabled = !bareRepository && rebaseDropDown.Items.Count > 0;
renameBranchToolStripMenuItem.DropDown = renameDropDown;
renameBranchToolStripMenuItem.Enabled = renameDropDown.Items.Count > 0;
checkoutRevisionToolStripMenuItem.Enabled = !bareRepository;
revertCommitToolStripMenuItem.Enabled = !bareRepository;
cherryPickCommitToolStripMenuItem.Enabled = !bareRepository;
manipulateCommitToolStripMenuItem.Enabled = !bareRepository;
toolStripSeparator6.Enabled = branchNameCopyToolStripMenuItem.Enabled || tagNameCopyToolStripMenuItem.Enabled;
RefreshOwnScripts();
}