diff --git a/GitUI/GitUI.csproj b/GitUI/GitUI.csproj index 8200be4be2a..dd34439b3ca 100644 --- a/GitUI/GitUI.csproj +++ b/GitUI/GitUI.csproj @@ -1865,6 +1865,9 @@ + + + diff --git a/GitUI/Properties/Resources.Designer.cs b/GitUI/Properties/Resources.Designer.cs index c3aec802095..4e9118f4440 100644 --- a/GitUI/Properties/Resources.Designer.cs +++ b/GitUI/Properties/Resources.Designer.cs @@ -60,6 +60,16 @@ internal class Resources { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Blame { + get { + object obj = ResourceManager.GetObject("Blame", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/GitUI/Properties/Resources.resx b/GitUI/Properties/Resources.resx index 787d9f68d94..465cdc1f3a7 100644 --- a/GitUI/Properties/Resources.resx +++ b/GitUI/Properties/Resources.resx @@ -213,4 +213,7 @@ Alexander Eifler, Marcelo Ghelman, ghanique, olshevskiy87 ..\Resources\bug.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Icons\Blame.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/GitUI/Translation/English.xlf b/GitUI/Translation/English.xlf index f362be0dadd..44c98857753 100644 --- a/GitUI/Translation/English.xlf +++ b/GitUI/Translation/English.xlf @@ -248,6 +248,10 @@ See http://en.gravatar.com/site/implement/images#default-image for more details. Blame previous revision + + Blame this revision + + Commit hash diff --git a/GitUI/UserControls/BlameControl.Designer.cs b/GitUI/UserControls/BlameControl.Designer.cs index 8d27b0c6027..25c9e5109d5 100644 --- a/GitUI/UserControls/BlameControl.Designer.cs +++ b/GitUI/UserControls/BlameControl.Designer.cs @@ -21,6 +21,7 @@ private void InitializeComponent() this.splitContainer2 = new System.Windows.Forms.SplitContainer(); this.BlameAuthor = new GitUI.Editor.FileViewer(); this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.blameRevisionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.blamePreviousRevisionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.showChangesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); @@ -104,6 +105,7 @@ private void InitializeComponent() // contextMenu // this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.blameRevisionToolStripMenuItem, this.blamePreviousRevisionToolStripMenuItem, this.showChangesToolStripMenuItem, this.toolStripSeparator1, @@ -116,6 +118,11 @@ private void InitializeComponent() // this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Size = new System.Drawing.Size(235, 6); + this.blameRevisionToolStripMenuItem.Image = global::GitUI.Properties.Resources.Blame; + this.blameRevisionToolStripMenuItem.Name = "blameRevisionToolStripMenuItem"; + this.blameRevisionToolStripMenuItem.Size = new System.Drawing.Size(199, 22); + this.blameRevisionToolStripMenuItem.Text = "Blame this revision"; + this.blameRevisionToolStripMenuItem.Click += new System.EventHandler(this.blameRevisionToolStripMenuItem_Click); // // blamePreviousRevisionToolStripMenuItem // @@ -214,5 +221,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem commitHashToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem commitMessageToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem allCommitInfoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem blameRevisionToolStripMenuItem; } } diff --git a/GitUI/UserControls/BlameControl.cs b/GitUI/UserControls/BlameControl.cs index bc280644aff..dcad4569305 100644 --- a/GitUI/UserControls/BlameControl.cs +++ b/GitUI/UserControls/BlameControl.cs @@ -415,6 +415,16 @@ private int GetBlameLine() private void contextMenu_Opened(object sender, EventArgs e) { contextMenu.Tag = GetBlameLine(); + + if (_revGrid == null || !TryGetSelectedRevision(out var selectedRevision)) + { + blameRevisionToolStripMenuItem.Enabled = false; + blamePreviousRevisionToolStripMenuItem.Enabled = false; + return; + } + + blameRevisionToolStripMenuItem.Enabled = true; + blamePreviousRevisionToolStripMenuItem.Enabled = selectedRevision.HasParent; } [CanBeNull] @@ -457,32 +467,50 @@ private void copyCommitHashToClipboardToolStripMenuItem_Click(object sender, Eve CopyToClipboard(c => c.ObjectId.ToString()); } + private bool TryGetSelectedRevision(out GitRevision selectedRevision) + { + var blameCommit = GetBlameCommit(); + if (blameCommit == null) + { + selectedRevision = null; + return false; + } + + selectedRevision = _revGrid?.GetRevision(blameCommit.ObjectId); + return selectedRevision != null; + } + + private void blameRevisionToolStripMenuItem_Click(object sender, EventArgs e) + { + if (!TryGetSelectedRevision(out var selectedRevision)) + { + return; + } + + BlameRevision(selectedRevision.ObjectId); + } + private void blamePreviousRevisionToolStripMenuItem_Click(object sender, EventArgs e) { - int line = (int?)contextMenu.Tag ?? -1; - if (line < 0) + if (!TryGetSelectedRevision(out var selectedRevision) || !selectedRevision.HasParent) { return; } - var objectId = _blame.Lines[line].Commit.ObjectId; - int originalLine = _blame.Lines[line].OriginLineNumber; - GitBlame blame = Module.Blame(_fileName, objectId + "^", _encoding, originalLine + ",+1"); - if (blame.Lines.Count > 0) + BlameRevision(selectedRevision.FirstParentGuid); + } + + private void BlameRevision(ObjectId revisionId) + { + if (_revGrid != null) { - var revision = blame.Lines[0].Commit.ObjectId; - if (_revGrid != null) - { - _clickedBlameLine = blame.Lines[0]; - _revGrid.SetSelectedRevision(revision); - } - else - { - using (var frm = new FormCommitDiff(UICommands, revision)) - { - frm.ShowDialog(this); - } - } + _revGrid.SetSelectedRevision(revisionId); + return; + } + + using (var frm = new FormCommitDiff(UICommands, revisionId)) + { + frm.ShowDialog(this); } }