mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2025-01-23 01:36:57 -08:00
enhance: disable unused context menus for bare
repository (#899)
This commit is contained in:
parent
a9327274c6
commit
766b60d05e
4 changed files with 397 additions and 362 deletions
|
@ -420,34 +420,37 @@ namespace SourceGit.ViewModels
|
||||||
menu.Items.Add(patch);
|
menu.Items.Add(patch);
|
||||||
menu.Items.Add(new MenuItem { Header = "-" });
|
menu.Items.Add(new MenuItem { Header = "-" });
|
||||||
|
|
||||||
var resetToThisRevision = new MenuItem();
|
if (!_repo.IsBare)
|
||||||
resetToThisRevision.Header = App.Text("ChangeCM.CheckoutThisRevision");
|
|
||||||
resetToThisRevision.Icon = App.CreateMenuIcon("Icons.File.Checkout");
|
|
||||||
resetToThisRevision.Click += (_, ev) =>
|
|
||||||
{
|
{
|
||||||
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.Path, $"{_commit.SHA}");
|
var resetToThisRevision = new MenuItem();
|
||||||
ev.Handled = true;
|
resetToThisRevision.Header = App.Text("ChangeCM.CheckoutThisRevision");
|
||||||
};
|
resetToThisRevision.Icon = App.CreateMenuIcon("Icons.File.Checkout");
|
||||||
|
resetToThisRevision.Click += (_, ev) =>
|
||||||
|
{
|
||||||
|
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.Path, $"{_commit.SHA}");
|
||||||
|
ev.Handled = true;
|
||||||
|
};
|
||||||
|
|
||||||
var resetToFirstParent = new MenuItem();
|
var resetToFirstParent = new MenuItem();
|
||||||
resetToFirstParent.Header = App.Text("ChangeCM.CheckoutFirstParentRevision");
|
resetToFirstParent.Header = App.Text("ChangeCM.CheckoutFirstParentRevision");
|
||||||
resetToFirstParent.Icon = App.CreateMenuIcon("Icons.File.Checkout");
|
resetToFirstParent.Icon = App.CreateMenuIcon("Icons.File.Checkout");
|
||||||
resetToFirstParent.IsEnabled = _commit.Parents.Count > 0;
|
resetToFirstParent.IsEnabled = _commit.Parents.Count > 0;
|
||||||
resetToFirstParent.Click += (_, ev) =>
|
resetToFirstParent.Click += (_, ev) =>
|
||||||
{
|
{
|
||||||
if (change.Index == Models.ChangeState.Renamed)
|
if (change.Index == Models.ChangeState.Renamed)
|
||||||
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.OriginalPath, $"{_commit.SHA}~1");
|
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.OriginalPath, $"{_commit.SHA}~1");
|
||||||
|
|
||||||
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.Path, $"{_commit.SHA}~1");
|
new Commands.Checkout(_repo.FullPath).FileWithRevision(change.Path, $"{_commit.SHA}~1");
|
||||||
ev.Handled = true;
|
ev.Handled = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
menu.Items.Add(resetToThisRevision);
|
menu.Items.Add(resetToThisRevision);
|
||||||
menu.Items.Add(resetToFirstParent);
|
menu.Items.Add(resetToFirstParent);
|
||||||
menu.Items.Add(new MenuItem { Header = "-" });
|
menu.Items.Add(new MenuItem { Header = "-" });
|
||||||
|
|
||||||
if (File.Exists(Path.Combine(fullPath)))
|
if (File.Exists(Path.Combine(fullPath)))
|
||||||
TryToAddContextMenuItemsForGitLFS(menu, change.Path);
|
TryToAddContextMenuItemsForGitLFS(menu, change.Path);
|
||||||
|
}
|
||||||
|
|
||||||
var copyPath = new MenuItem();
|
var copyPath = new MenuItem();
|
||||||
copyPath.Header = App.Text("CopyPath");
|
copyPath.Header = App.Text("CopyPath");
|
||||||
|
|
|
@ -253,36 +253,39 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
var multipleMenu = new ContextMenu();
|
var multipleMenu = new ContextMenu();
|
||||||
|
|
||||||
if (canCherryPick)
|
if (!_repo.IsBare)
|
||||||
{
|
{
|
||||||
var cherryPickMultiple = new MenuItem();
|
if (canCherryPick)
|
||||||
cherryPickMultiple.Header = App.Text("CommitCM.CherryPickMultiple");
|
|
||||||
cherryPickMultiple.Icon = App.CreateMenuIcon("Icons.CherryPick");
|
|
||||||
cherryPickMultiple.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
var cherryPickMultiple = new MenuItem();
|
||||||
_repo.ShowPopup(new CherryPick(_repo, selected));
|
cherryPickMultiple.Header = App.Text("CommitCM.CherryPickMultiple");
|
||||||
e.Handled = true;
|
cherryPickMultiple.Icon = App.CreateMenuIcon("Icons.CherryPick");
|
||||||
};
|
cherryPickMultiple.Click += (_, e) =>
|
||||||
multipleMenu.Items.Add(cherryPickMultiple);
|
{
|
||||||
}
|
if (_repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new CherryPick(_repo, selected));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
multipleMenu.Items.Add(cherryPickMultiple);
|
||||||
|
}
|
||||||
|
|
||||||
if (canMerge)
|
if (canMerge)
|
||||||
{
|
|
||||||
var mergeMultiple = new MenuItem();
|
|
||||||
mergeMultiple.Header = App.Text("CommitCM.MergeMultiple");
|
|
||||||
mergeMultiple.Icon = App.CreateMenuIcon("Icons.Merge");
|
|
||||||
mergeMultiple.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
var mergeMultiple = new MenuItem();
|
||||||
_repo.ShowPopup(new MergeMultiple(_repo, selected));
|
mergeMultiple.Header = App.Text("CommitCM.MergeMultiple");
|
||||||
e.Handled = true;
|
mergeMultiple.Icon = App.CreateMenuIcon("Icons.Merge");
|
||||||
};
|
mergeMultiple.Click += (_, e) =>
|
||||||
multipleMenu.Items.Add(mergeMultiple);
|
{
|
||||||
}
|
if (_repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new MergeMultiple(_repo, selected));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
multipleMenu.Items.Add(mergeMultiple);
|
||||||
|
}
|
||||||
|
|
||||||
if (canCherryPick || canMerge)
|
if (canCherryPick || canMerge)
|
||||||
multipleMenu.Items.Add(new MenuItem() { Header = "-" });
|
multipleMenu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
}
|
||||||
|
|
||||||
var saveToPatchMultiple = new MenuItem();
|
var saveToPatchMultiple = new MenuItem();
|
||||||
saveToPatchMultiple.Icon = App.CreateMenuIcon("Icons.Diff");
|
saveToPatchMultiple.Icon = App.CreateMenuIcon("Icons.Diff");
|
||||||
|
@ -394,25 +397,48 @@ namespace SourceGit.ViewModels
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current.Head != commit.SHA)
|
if (!_repo.IsBare)
|
||||||
{
|
{
|
||||||
var reset = new MenuItem();
|
if (current.Head != commit.SHA)
|
||||||
reset.Header = new Views.NameHighlightedTextBlock("CommitCM.Reset", current.Name);
|
|
||||||
reset.Icon = App.CreateMenuIcon("Icons.Reset");
|
|
||||||
reset.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
var reset = new MenuItem();
|
||||||
_repo.ShowPopup(new Reset(_repo, current, commit));
|
reset.Header = new Views.NameHighlightedTextBlock("CommitCM.Reset", current.Name);
|
||||||
e.Handled = true;
|
reset.Icon = App.CreateMenuIcon("Icons.Reset");
|
||||||
};
|
reset.Click += (_, e) =>
|
||||||
menu.Items.Add(reset);
|
{
|
||||||
|
if (_repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new Reset(_repo, current, commit));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(reset);
|
||||||
|
|
||||||
if (commit.IsMerged)
|
if (commit.IsMerged)
|
||||||
|
{
|
||||||
|
var squash = new MenuItem();
|
||||||
|
squash.Header = App.Text("CommitCM.SquashCommitsSinceThis");
|
||||||
|
squash.Icon = App.CreateMenuIcon("Icons.SquashIntoParent");
|
||||||
|
squash.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (_repo.LocalChangesCount > 0)
|
||||||
|
{
|
||||||
|
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new Squash(_repo, commit, commit.SHA));
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(squash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
var squash = new MenuItem();
|
var reword = new MenuItem();
|
||||||
squash.Header = App.Text("CommitCM.SquashCommitsSinceThis");
|
reword.Header = App.Text("CommitCM.Reword");
|
||||||
squash.Icon = App.CreateMenuIcon("Icons.SquashIntoParent");
|
reword.Icon = App.CreateMenuIcon("Icons.Edit");
|
||||||
squash.Click += (_, e) =>
|
reword.Click += (_, e) =>
|
||||||
{
|
{
|
||||||
if (_repo.LocalChangesCount > 0)
|
if (_repo.LocalChangesCount > 0)
|
||||||
{
|
{
|
||||||
|
@ -421,169 +447,149 @@ namespace SourceGit.ViewModels
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_repo.CanCreatePopup())
|
if (_repo.CanCreatePopup())
|
||||||
_repo.ShowPopup(new Squash(_repo, commit, commit.SHA));
|
_repo.ShowPopup(new Reword(_repo, commit));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(reword);
|
||||||
|
|
||||||
|
var squash = new MenuItem();
|
||||||
|
squash.Header = App.Text("CommitCM.Squash");
|
||||||
|
squash.Icon = App.CreateMenuIcon("Icons.SquashIntoParent");
|
||||||
|
squash.IsEnabled = commit.Parents.Count == 1;
|
||||||
|
squash.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (_repo.LocalChangesCount > 0)
|
||||||
|
{
|
||||||
|
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (commit.Parents.Count == 1)
|
||||||
|
{
|
||||||
|
var parent = _commits.Find(x => x.SHA == commit.Parents[0]);
|
||||||
|
if (parent != null && _repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new Squash(_repo, parent, commit.SHA));
|
||||||
|
}
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
menu.Items.Add(squash);
|
menu.Items.Add(squash);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
if (!commit.IsMerged)
|
||||||
{
|
|
||||||
var reword = new MenuItem();
|
|
||||||
reword.Header = App.Text("CommitCM.Reword");
|
|
||||||
reword.Icon = App.CreateMenuIcon("Icons.Edit");
|
|
||||||
reword.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.LocalChangesCount > 0)
|
var rebase = new MenuItem();
|
||||||
{
|
rebase.Header = new Views.NameHighlightedTextBlock("CommitCM.Rebase", current.Name);
|
||||||
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
rebase.Icon = App.CreateMenuIcon("Icons.Rebase");
|
||||||
return;
|
rebase.Click += (_, e) =>
|
||||||
}
|
|
||||||
|
|
||||||
if (_repo.CanCreatePopup())
|
|
||||||
_repo.ShowPopup(new Reword(_repo, commit));
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
menu.Items.Add(reword);
|
|
||||||
|
|
||||||
var squash = new MenuItem();
|
|
||||||
squash.Header = App.Text("CommitCM.Squash");
|
|
||||||
squash.Icon = App.CreateMenuIcon("Icons.SquashIntoParent");
|
|
||||||
squash.IsEnabled = commit.Parents.Count == 1;
|
|
||||||
squash.Click += (_, e) =>
|
|
||||||
{
|
|
||||||
if (_repo.LocalChangesCount > 0)
|
|
||||||
{
|
|
||||||
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (commit.Parents.Count == 1)
|
|
||||||
{
|
|
||||||
var parent = _commits.Find(x => x.SHA == commit.Parents[0]);
|
|
||||||
if (parent != null && _repo.CanCreatePopup())
|
|
||||||
_repo.ShowPopup(new Squash(_repo, parent, commit.SHA));
|
|
||||||
}
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
menu.Items.Add(squash);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!commit.IsMerged)
|
|
||||||
{
|
|
||||||
var rebase = new MenuItem();
|
|
||||||
rebase.Header = new Views.NameHighlightedTextBlock("CommitCM.Rebase", current.Name);
|
|
||||||
rebase.Icon = App.CreateMenuIcon("Icons.Rebase");
|
|
||||||
rebase.Click += (_, e) =>
|
|
||||||
{
|
|
||||||
if (_repo.CanCreatePopup())
|
|
||||||
_repo.ShowPopup(new Rebase(_repo, current, commit));
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
menu.Items.Add(rebase);
|
|
||||||
|
|
||||||
if (!commit.HasDecorators)
|
|
||||||
{
|
|
||||||
var merge = new MenuItem();
|
|
||||||
merge.Header = new Views.NameHighlightedTextBlock("CommitCM.Merge", current.Name);
|
|
||||||
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
|
||||||
merge.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
if (_repo.CanCreatePopup())
|
||||||
_repo.ShowPopup(new Merge(_repo, commit, current.Name));
|
_repo.ShowPopup(new Rebase(_repo, current, commit));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(rebase);
|
||||||
|
|
||||||
|
if (!commit.HasDecorators)
|
||||||
|
{
|
||||||
|
var merge = new MenuItem();
|
||||||
|
merge.Header = new Views.NameHighlightedTextBlock("CommitCM.Merge", current.Name);
|
||||||
|
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
||||||
|
merge.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (_repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new Merge(_repo, commit, current.Name));
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(merge);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cherryPick = new MenuItem();
|
||||||
|
cherryPick.Header = App.Text("CommitCM.CherryPick");
|
||||||
|
cherryPick.Icon = App.CreateMenuIcon("Icons.CherryPick");
|
||||||
|
cherryPick.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (_repo.CanCreatePopup())
|
||||||
|
{
|
||||||
|
if (commit.Parents.Count <= 1)
|
||||||
|
{
|
||||||
|
_repo.ShowPopup(new CherryPick(_repo, [commit]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var parents = new List<Models.Commit>();
|
||||||
|
foreach (var sha in commit.Parents)
|
||||||
|
{
|
||||||
|
var parent = _commits.Find(x => x.SHA == sha);
|
||||||
|
if (parent == null)
|
||||||
|
parent = new Commands.QuerySingleCommit(_repo.FullPath, sha).Result();
|
||||||
|
|
||||||
|
if (parent != null)
|
||||||
|
parents.Add(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
_repo.ShowPopup(new CherryPick(_repo, commit, parents));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
menu.Items.Add(merge);
|
menu.Items.Add(cherryPick);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var revert = new MenuItem();
|
||||||
|
revert.Header = App.Text("CommitCM.Revert");
|
||||||
|
revert.Icon = App.CreateMenuIcon("Icons.Undo");
|
||||||
|
revert.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (_repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new Revert(_repo, commit));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(revert);
|
||||||
}
|
}
|
||||||
|
|
||||||
var cherryPick = new MenuItem();
|
if (current.Head != commit.SHA)
|
||||||
cherryPick.Header = App.Text("CommitCM.CherryPick");
|
|
||||||
cherryPick.Icon = App.CreateMenuIcon("Icons.CherryPick");
|
|
||||||
cherryPick.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
var checkoutCommit = new MenuItem();
|
||||||
|
checkoutCommit.Header = App.Text("CommitCM.Checkout");
|
||||||
|
checkoutCommit.Icon = App.CreateMenuIcon("Icons.Detached");
|
||||||
|
checkoutCommit.Click += (_, e) =>
|
||||||
{
|
{
|
||||||
if (commit.Parents.Count <= 1)
|
if (_repo.CanCreatePopup())
|
||||||
{
|
_repo.ShowPopup(new CheckoutCommit(_repo, commit));
|
||||||
_repo.ShowPopup(new CherryPick(_repo, [commit]));
|
e.Handled = true;
|
||||||
}
|
};
|
||||||
else
|
menu.Items.Add(checkoutCommit);
|
||||||
{
|
}
|
||||||
var parents = new List<Models.Commit>();
|
|
||||||
foreach (var sha in commit.Parents)
|
|
||||||
{
|
|
||||||
var parent = _commits.Find(x => x.SHA == sha);
|
|
||||||
if (parent == null)
|
|
||||||
parent = new Commands.QuerySingleCommit(_repo.FullPath, sha).Result();
|
|
||||||
|
|
||||||
if (parent != null)
|
|
||||||
parents.Add(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
_repo.ShowPopup(new CherryPick(_repo, commit, parents));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
menu.Items.Add(cherryPick);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var revert = new MenuItem();
|
|
||||||
revert.Header = App.Text("CommitCM.Revert");
|
|
||||||
revert.Icon = App.CreateMenuIcon("Icons.Undo");
|
|
||||||
revert.Click += (_, e) =>
|
|
||||||
{
|
|
||||||
if (_repo.CanCreatePopup())
|
|
||||||
_repo.ShowPopup(new Revert(_repo, commit));
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
menu.Items.Add(revert);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current.Head != commit.SHA)
|
|
||||||
{
|
|
||||||
var checkoutCommit = new MenuItem();
|
|
||||||
checkoutCommit.Header = App.Text("CommitCM.Checkout");
|
|
||||||
checkoutCommit.Icon = App.CreateMenuIcon("Icons.Detached");
|
|
||||||
checkoutCommit.Click += (_, e) =>
|
|
||||||
{
|
|
||||||
if (_repo.CanCreatePopup())
|
|
||||||
_repo.ShowPopup(new CheckoutCommit(_repo, commit));
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
menu.Items.Add(checkoutCommit);
|
|
||||||
}
|
|
||||||
|
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
|
||||||
|
|
||||||
if (commit.IsMerged && current.Head != commit.SHA)
|
|
||||||
{
|
|
||||||
var interactiveRebase = new MenuItem();
|
|
||||||
interactiveRebase.Header = new Views.NameHighlightedTextBlock("CommitCM.InteractiveRebase", current.Name);
|
|
||||||
interactiveRebase.Icon = App.CreateMenuIcon("Icons.InteractiveRebase");
|
|
||||||
interactiveRebase.Click += (_, e) =>
|
|
||||||
{
|
|
||||||
if (_repo.LocalChangesCount > 0)
|
|
||||||
{
|
|
||||||
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
App.OpenDialog(new Views.InteractiveRebase()
|
|
||||||
{
|
|
||||||
DataContext = new InteractiveRebase(_repo, current, commit)
|
|
||||||
});
|
|
||||||
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
menu.Items.Add(interactiveRebase);
|
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
}
|
|
||||||
|
if (commit.IsMerged && current.Head != commit.SHA)
|
||||||
|
{
|
||||||
|
var interactiveRebase = new MenuItem();
|
||||||
|
interactiveRebase.Header = new Views.NameHighlightedTextBlock("CommitCM.InteractiveRebase", current.Name);
|
||||||
|
interactiveRebase.Icon = App.CreateMenuIcon("Icons.InteractiveRebase");
|
||||||
|
interactiveRebase.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (_repo.LocalChangesCount > 0)
|
||||||
|
{
|
||||||
|
App.RaiseException(_repo.FullPath, "You have local changes. Please run stash or discard first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
App.OpenDialog(new Views.InteractiveRebase()
|
||||||
|
{
|
||||||
|
DataContext = new InteractiveRebase(_repo, current, commit)
|
||||||
|
});
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(interactiveRebase);
|
||||||
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (current.Head != commit.SHA)
|
if (current.Head != commit.SHA)
|
||||||
{
|
{
|
||||||
|
@ -914,21 +920,24 @@ namespace SourceGit.ViewModels
|
||||||
submenu.Items.Add(rename);
|
submenu.Items.Add(rename);
|
||||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
|
||||||
var detect = Commands.GitFlow.DetectType(_repo.FullPath, _repo.Branches, current.Name);
|
if (!_repo.IsBare)
|
||||||
if (detect.IsGitFlowBranch)
|
|
||||||
{
|
{
|
||||||
var finish = new MenuItem();
|
var detect = Commands.GitFlow.DetectType(_repo.FullPath, _repo.Branches, current.Name);
|
||||||
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", current.Name);
|
if (detect.IsGitFlowBranch)
|
||||||
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
|
||||||
finish.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
var finish = new MenuItem();
|
||||||
_repo.ShowPopup(new GitFlowFinish(_repo, current, detect.Type, detect.Prefix));
|
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", current.Name);
|
||||||
e.Handled = true;
|
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
||||||
};
|
finish.Click += (_, e) =>
|
||||||
submenu.Items.Add(finish);
|
{
|
||||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
if (_repo.CanCreatePopup())
|
||||||
}
|
_repo.ShowPopup(new GitFlowFinish(_repo, current, detect.Type, detect.Prefix));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
submenu.Items.Add(finish);
|
||||||
|
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var copy = new MenuItem();
|
var copy = new MenuItem();
|
||||||
copy.Header = App.Text("BranchCM.CopyName");
|
copy.Header = App.Text("BranchCM.CopyName");
|
||||||
|
@ -951,27 +960,30 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
FillBranchVisibilityMenu(submenu, branch);
|
FillBranchVisibilityMenu(submenu, branch);
|
||||||
|
|
||||||
var checkout = new MenuItem();
|
if (!_repo.IsBare)
|
||||||
checkout.Header = new Views.NameHighlightedTextBlock("BranchCM.Checkout", branch.Name);
|
|
||||||
checkout.Icon = App.CreateMenuIcon("Icons.Check");
|
|
||||||
checkout.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
_repo.CheckoutBranch(branch);
|
var checkout = new MenuItem();
|
||||||
e.Handled = true;
|
checkout.Header = new Views.NameHighlightedTextBlock("BranchCM.Checkout", branch.Name);
|
||||||
};
|
checkout.Icon = App.CreateMenuIcon("Icons.Check");
|
||||||
submenu.Items.Add(checkout);
|
checkout.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
_repo.CheckoutBranch(branch);
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
submenu.Items.Add(checkout);
|
||||||
|
|
||||||
var merge = new MenuItem();
|
var merge = new MenuItem();
|
||||||
merge.Header = new Views.NameHighlightedTextBlock("BranchCM.Merge", branch.Name, current.Name);
|
merge.Header = new Views.NameHighlightedTextBlock("BranchCM.Merge", branch.Name, current.Name);
|
||||||
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
||||||
merge.IsEnabled = !merged;
|
merge.IsEnabled = !merged;
|
||||||
merge.Click += (_, e) =>
|
merge.Click += (_, e) =>
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
if (_repo.CanCreatePopup())
|
||||||
_repo.ShowPopup(new Merge(_repo, branch, current.Name));
|
_repo.ShowPopup(new Merge(_repo, branch, current.Name));
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
submenu.Items.Add(merge);
|
submenu.Items.Add(merge);
|
||||||
|
}
|
||||||
|
|
||||||
var rename = new MenuItem();
|
var rename = new MenuItem();
|
||||||
rename.Header = new Views.NameHighlightedTextBlock("BranchCM.Rename", branch.Name);
|
rename.Header = new Views.NameHighlightedTextBlock("BranchCM.Rename", branch.Name);
|
||||||
|
@ -996,21 +1008,24 @@ namespace SourceGit.ViewModels
|
||||||
submenu.Items.Add(delete);
|
submenu.Items.Add(delete);
|
||||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
|
||||||
var detect = Commands.GitFlow.DetectType(_repo.FullPath, _repo.Branches, branch.Name);
|
if (!_repo.IsBare)
|
||||||
if (detect.IsGitFlowBranch)
|
|
||||||
{
|
{
|
||||||
var finish = new MenuItem();
|
var detect = Commands.GitFlow.DetectType(_repo.FullPath, _repo.Branches, branch.Name);
|
||||||
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
if (detect.IsGitFlowBranch)
|
||||||
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
|
||||||
finish.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
var finish = new MenuItem();
|
||||||
_repo.ShowPopup(new GitFlowFinish(_repo, branch, detect.Type, detect.Prefix));
|
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
||||||
e.Handled = true;
|
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
||||||
};
|
finish.Click += (_, e) =>
|
||||||
submenu.Items.Add(finish);
|
{
|
||||||
submenu.Items.Add(new MenuItem() { Header = "-" });
|
if (_repo.CanCreatePopup())
|
||||||
}
|
_repo.ShowPopup(new GitFlowFinish(_repo, branch, detect.Type, detect.Prefix));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
submenu.Items.Add(finish);
|
||||||
|
submenu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var copy = new MenuItem();
|
var copy = new MenuItem();
|
||||||
copy.Header = App.Text("BranchCM.CopyName");
|
copy.Header = App.Text("BranchCM.CopyName");
|
||||||
|
@ -1104,17 +1119,19 @@ namespace SourceGit.ViewModels
|
||||||
};
|
};
|
||||||
submenu.Items.Add(push);
|
submenu.Items.Add(push);
|
||||||
|
|
||||||
var merge = new MenuItem();
|
if (!_repo.IsBare && !merged)
|
||||||
merge.Header = new Views.NameHighlightedTextBlock("TagCM.Merge", tag.Name, current.Name);
|
|
||||||
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
|
||||||
merge.IsEnabled = !merged;
|
|
||||||
merge.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (_repo.CanCreatePopup())
|
var merge = new MenuItem();
|
||||||
_repo.ShowPopup(new Merge(_repo, tag, current.Name));
|
merge.Header = new Views.NameHighlightedTextBlock("TagCM.Merge", tag.Name, current.Name);
|
||||||
e.Handled = true;
|
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
||||||
};
|
merge.Click += (_, e) =>
|
||||||
submenu.Items.Add(merge);
|
{
|
||||||
|
if (_repo.CanCreatePopup())
|
||||||
|
_repo.ShowPopup(new Merge(_repo, tag, current.Name));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
submenu.Items.Add(merge);
|
||||||
|
}
|
||||||
|
|
||||||
var delete = new MenuItem();
|
var delete = new MenuItem();
|
||||||
delete.Header = new Views.NameHighlightedTextBlock("TagCM.Delete", tag.Name);
|
delete.Header = new Views.NameHighlightedTextBlock("TagCM.Delete", tag.Name);
|
||||||
|
|
|
@ -1434,66 +1434,72 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
if (branch.IsCurrent)
|
if (branch.IsCurrent)
|
||||||
{
|
{
|
||||||
var discard = new MenuItem();
|
if (!IsBare)
|
||||||
discard.Header = App.Text("BranchCM.DiscardAll");
|
|
||||||
discard.Icon = App.CreateMenuIcon("Icons.Undo");
|
|
||||||
discard.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (CanCreatePopup())
|
var discard = new MenuItem();
|
||||||
ShowPopup(new Discard(this));
|
discard.Header = App.Text("BranchCM.DiscardAll");
|
||||||
e.Handled = true;
|
discard.Icon = App.CreateMenuIcon("Icons.Undo");
|
||||||
};
|
discard.Click += (_, e) =>
|
||||||
|
|
||||||
menu.Items.Add(discard);
|
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(branch.Upstream))
|
|
||||||
{
|
|
||||||
var upstream = branch.Upstream.Substring(13);
|
|
||||||
var fastForward = new MenuItem();
|
|
||||||
fastForward.Header = new Views.NameHighlightedTextBlock("BranchCM.FastForward", upstream);
|
|
||||||
fastForward.Icon = App.CreateMenuIcon("Icons.FastForward");
|
|
||||||
fastForward.IsEnabled = branch.TrackStatus.Ahead.Count == 0;
|
|
||||||
fastForward.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
var b = _branches.Find(x => x.FriendlyName == upstream);
|
|
||||||
if (b == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (CanCreatePopup())
|
if (CanCreatePopup())
|
||||||
ShowAndStartPopup(new Merge(this, b, branch.Name));
|
ShowPopup(new Discard(this));
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
var pull = new MenuItem();
|
menu.Items.Add(discard);
|
||||||
pull.Header = new Views.NameHighlightedTextBlock("BranchCM.Pull", upstream);
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
pull.Icon = App.CreateMenuIcon("Icons.Pull");
|
|
||||||
pull.Click += (_, e) =>
|
|
||||||
{
|
|
||||||
if (CanCreatePopup())
|
|
||||||
ShowPopup(new Pull(this, null));
|
|
||||||
e.Handled = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
menu.Items.Add(fastForward);
|
if (!string.IsNullOrEmpty(branch.Upstream))
|
||||||
menu.Items.Add(pull);
|
{
|
||||||
}
|
var upstream = branch.Upstream.Substring(13);
|
||||||
|
var fastForward = new MenuItem();
|
||||||
|
fastForward.Header = new Views.NameHighlightedTextBlock("BranchCM.FastForward", upstream);
|
||||||
|
fastForward.Icon = App.CreateMenuIcon("Icons.FastForward");
|
||||||
|
fastForward.IsEnabled = branch.TrackStatus.Ahead.Count == 0;
|
||||||
|
fastForward.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
var b = _branches.Find(x => x.FriendlyName == upstream);
|
||||||
|
if (b == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (CanCreatePopup())
|
||||||
|
ShowAndStartPopup(new Merge(this, b, branch.Name));
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
var pull = new MenuItem();
|
||||||
|
pull.Header = new Views.NameHighlightedTextBlock("BranchCM.Pull", upstream);
|
||||||
|
pull.Icon = App.CreateMenuIcon("Icons.Pull");
|
||||||
|
pull.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (CanCreatePopup())
|
||||||
|
ShowPopup(new Pull(this, null));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
menu.Items.Add(fastForward);
|
||||||
|
menu.Items.Add(pull);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
menu.Items.Add(push);
|
menu.Items.Add(push);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var checkout = new MenuItem();
|
if (!IsBare)
|
||||||
checkout.Header = new Views.NameHighlightedTextBlock("BranchCM.Checkout", branch.Name);
|
|
||||||
checkout.Icon = App.CreateMenuIcon("Icons.Check");
|
|
||||||
checkout.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
CheckoutBranch(branch);
|
var checkout = new MenuItem();
|
||||||
e.Handled = true;
|
checkout.Header = new Views.NameHighlightedTextBlock("BranchCM.Checkout", branch.Name);
|
||||||
};
|
checkout.Icon = App.CreateMenuIcon("Icons.Check");
|
||||||
menu.Items.Add(checkout);
|
checkout.Click += (_, e) =>
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
{
|
||||||
|
CheckoutBranch(branch);
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(checkout);
|
||||||
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
}
|
||||||
|
|
||||||
var worktree = _worktrees.Find(x => x.Branch == branch.FullName);
|
var worktree = _worktrees.Find(x => x.Branch == branch.FullName);
|
||||||
var upstream = _branches.Find(x => x.FullName == branch.Upstream);
|
var upstream = _branches.Find(x => x.FullName == branch.Upstream);
|
||||||
|
@ -1528,28 +1534,31 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
menu.Items.Add(push);
|
menu.Items.Add(push);
|
||||||
|
|
||||||
var merge = new MenuItem();
|
if (!IsBare)
|
||||||
merge.Header = new Views.NameHighlightedTextBlock("BranchCM.Merge", branch.Name, _currentBranch.Name);
|
|
||||||
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
|
||||||
merge.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (CanCreatePopup())
|
var merge = new MenuItem();
|
||||||
ShowPopup(new Merge(this, branch, _currentBranch.Name));
|
merge.Header = new Views.NameHighlightedTextBlock("BranchCM.Merge", branch.Name, _currentBranch.Name);
|
||||||
e.Handled = true;
|
merge.Icon = App.CreateMenuIcon("Icons.Merge");
|
||||||
};
|
merge.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (CanCreatePopup())
|
||||||
|
ShowPopup(new Merge(this, branch, _currentBranch.Name));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
|
||||||
var rebase = new MenuItem();
|
var rebase = new MenuItem();
|
||||||
rebase.Header = new Views.NameHighlightedTextBlock("BranchCM.Rebase", _currentBranch.Name, branch.Name);
|
rebase.Header = new Views.NameHighlightedTextBlock("BranchCM.Rebase", _currentBranch.Name, branch.Name);
|
||||||
rebase.Icon = App.CreateMenuIcon("Icons.Rebase");
|
rebase.Icon = App.CreateMenuIcon("Icons.Rebase");
|
||||||
rebase.Click += (_, e) =>
|
rebase.Click += (_, e) =>
|
||||||
{
|
{
|
||||||
if (CanCreatePopup())
|
if (CanCreatePopup())
|
||||||
ShowPopup(new Rebase(this, _currentBranch, branch));
|
ShowPopup(new Rebase(this, _currentBranch, branch));
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
menu.Items.Add(merge);
|
menu.Items.Add(merge);
|
||||||
menu.Items.Add(rebase);
|
menu.Items.Add(rebase);
|
||||||
|
}
|
||||||
|
|
||||||
var compareWithHead = new MenuItem();
|
var compareWithHead = new MenuItem();
|
||||||
compareWithHead.Header = App.Text("BranchCM.CompareWithHead");
|
compareWithHead.Header = App.Text("BranchCM.CompareWithHead");
|
||||||
|
@ -1584,21 +1593,24 @@ namespace SourceGit.ViewModels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var detect = Commands.GitFlow.DetectType(_fullpath, _branches, branch.Name);
|
if (!IsBare)
|
||||||
if (detect.IsGitFlowBranch)
|
|
||||||
{
|
{
|
||||||
var finish = new MenuItem();
|
var detect = Commands.GitFlow.DetectType(_fullpath, _branches, branch.Name);
|
||||||
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
if (detect.IsGitFlowBranch)
|
||||||
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
|
||||||
finish.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (CanCreatePopup())
|
var finish = new MenuItem();
|
||||||
ShowPopup(new GitFlowFinish(this, branch, detect.Type, detect.Prefix));
|
finish.Header = new Views.NameHighlightedTextBlock("BranchCM.Finish", branch.Name);
|
||||||
e.Handled = true;
|
finish.Icon = App.CreateMenuIcon("Icons.GitFlow");
|
||||||
};
|
finish.Click += (_, e) =>
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
{
|
||||||
menu.Items.Add(finish);
|
if (CanCreatePopup())
|
||||||
}
|
ShowPopup(new GitFlowFinish(this, branch, detect.Type, detect.Prefix));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
menu.Items.Add(finish);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var rename = new MenuItem();
|
var rename = new MenuItem();
|
||||||
rename.Header = new Views.NameHighlightedTextBlock("BranchCM.Rename", branch.Name);
|
rename.Header = new Views.NameHighlightedTextBlock("BranchCM.Rename", branch.Name);
|
||||||
|
@ -1649,26 +1661,29 @@ namespace SourceGit.ViewModels
|
||||||
menu.Items.Add(createTag);
|
menu.Items.Add(createTag);
|
||||||
menu.Items.Add(new MenuItem() { Header = "-" });
|
menu.Items.Add(new MenuItem() { Header = "-" });
|
||||||
|
|
||||||
var remoteBranches = new List<Models.Branch>();
|
if (!IsBare)
|
||||||
foreach (var b in _branches)
|
|
||||||
{
|
{
|
||||||
if (!b.IsLocal)
|
var remoteBranches = new List<Models.Branch>();
|
||||||
remoteBranches.Add(b);
|
foreach (var b in _branches)
|
||||||
}
|
|
||||||
|
|
||||||
if (remoteBranches.Count > 0)
|
|
||||||
{
|
|
||||||
var tracking = new MenuItem();
|
|
||||||
tracking.Header = App.Text("BranchCM.Tracking");
|
|
||||||
tracking.Icon = App.CreateMenuIcon("Icons.Track");
|
|
||||||
tracking.Click += (_, e) =>
|
|
||||||
{
|
{
|
||||||
if (CanCreatePopup())
|
if (!b.IsLocal)
|
||||||
ShowPopup(new SetUpstream(this, branch, remoteBranches));
|
remoteBranches.Add(b);
|
||||||
e.Handled = true;
|
}
|
||||||
};
|
|
||||||
menu.Items.Add(tracking);
|
if (remoteBranches.Count > 0)
|
||||||
}
|
{
|
||||||
|
var tracking = new MenuItem();
|
||||||
|
tracking.Header = App.Text("BranchCM.Tracking");
|
||||||
|
tracking.Icon = App.CreateMenuIcon("Icons.Track");
|
||||||
|
tracking.Click += (_, e) =>
|
||||||
|
{
|
||||||
|
if (CanCreatePopup())
|
||||||
|
ShowPopup(new SetUpstream(this, branch, remoteBranches));
|
||||||
|
e.Handled = true;
|
||||||
|
};
|
||||||
|
menu.Items.Add(tracking);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var archive = new MenuItem();
|
var archive = new MenuItem();
|
||||||
archive.Icon = App.CreateMenuIcon("Icons.Archive");
|
archive.Icon = App.CreateMenuIcon("Icons.Archive");
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
<Path Width="14" Height="14" Data="{StaticResource Icons.Explore}" Margin="0,2,0,0"/>
|
<Path Width="14" Height="14" Data="{StaticResource Icons.Explore}" Margin="0,2,0,0"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button Classes="icon_button" Width="32" Click="OpenWithExternalTools" ToolTip.Tip="{DynamicResource Text.Repository.OpenWithExternalTools}">
|
<Button Classes="icon_button" Width="32" Click="OpenWithExternalTools" IsVisible="{Binding !IsBare}" ToolTip.Tip="{DynamicResource Text.Repository.OpenWithExternalTools}">
|
||||||
<Path Width="13" Height="13" Data="{StaticResource Icons.OpenWith}"/>
|
<Path Width="13" Height="13" Data="{StaticResource Icons.OpenWith}"/>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue