From 0115df9a177b31b35d0301845b71fc3d6016a616 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20Strau=C3=9F?= Date: Wed, 30 Oct 2013 22:14:33 +0100 Subject: [PATCH] Survive blame line without corresponding log entry MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Strauß Signed-off-by: Sven Strickroth --- src/TortoiseGitBlame/TortoiseGitBlameData.h | 7 ++++- src/TortoiseGitBlame/TortoiseGitBlameView.cpp | 42 ++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/TortoiseGitBlame/TortoiseGitBlameData.h b/src/TortoiseGitBlame/TortoiseGitBlameData.h index 784955ae2..e89dd3144 100644 --- a/src/TortoiseGitBlame/TortoiseGitBlameData.h +++ b/src/TortoiseGitBlame/TortoiseGitBlameData.h @@ -110,9 +110,14 @@ public: return m_Utf8Lines[line]; } - static GitRev* GetRevForHash(CGitHashMap & HashToRev, CGitHash& hash); + GitRev* GetRev(int line, CGitHashMap & hashToRev) + { + return GetRevForHash(hashToRev, GetHash(line)); + } private: + static GitRev* GetRevForHash(CGitHashMap & HashToRev, CGitHash& hash); + std::vector m_Hash; std::vector m_Dates; std::vector m_Authors; diff --git a/src/TortoiseGitBlame/TortoiseGitBlameView.cpp b/src/TortoiseGitBlame/TortoiseGitBlameView.cpp index 170cbbcea..827070e2b 100644 --- a/src/TortoiseGitBlame/TortoiseGitBlameView.cpp +++ b/src/TortoiseGitBlame/TortoiseGitBlameView.cpp @@ -365,7 +365,13 @@ void CTortoiseGitBlameView::OnRButtonUp(UINT /*nFlags*/, CPoint point) CGitHash hash = m_data.GetHash(line); CString hashStr = hash.ToString(); - GitRev* pRev = &GetLogData()->GetGitRevAt(m_lineToLogIndex[line]); + GitRev* pRev = nullptr; + int logIndex = m_lineToLogIndex[line]; + if (logIndex >= 0) + pRev = &GetLogData()->GetGitRevAt(logIndex); + else + pRev = m_data.GetRev(line, GetLogData()->m_pLogCache->m_HashMap); + if (!pRev) return; @@ -1663,11 +1669,14 @@ COLORREF CTortoiseGitBlameView::GetLineColor(int line) { if (m_colorage && m_data.IsValidLine(line)) { - int slider = (int)((GetLogData()->size() - m_lineToLogIndex[line] - m_lowestrev) * 100 / ((m_highestrev - m_lowestrev) + 1)); - return InterColor(DWORD(m_regOldLinesColor), DWORD(m_regNewLinesColor), slider); + int logIndex = m_lineToLogIndex[line]; + if (logIndex >= 0) + { + int slider = (int)((GetLogData()->size() - logIndex - m_lowestrev) * 100 / ((m_highestrev - m_lowestrev) + 1)); + return InterColor(DWORD(m_regOldLinesColor), DWORD(m_regNewLinesColor), slider); + } } - else - return m_windowcolor; + return m_windowcolor; } CGitBlameLogList * CTortoiseGitBlameView::GetLogList() @@ -1701,8 +1710,16 @@ void CTortoiseGitBlameView::OnLButtonDown(UINT nFlags,CPoint point) m_SelectedHash = m_data.GetHash(line); int logIndex = m_lineToLogIndex[line]; - this->GetLogList()->SetItemState(logIndex, LVIS_SELECTED, LVIS_SELECTED); - this->GetLogList()->EnsureVisible(logIndex, FALSE); + if (logIndex >= 0) + { + this->GetLogList()->SetItemState(logIndex, LVIS_SELECTED, LVIS_SELECTED); + this->GetLogList()->EnsureVisible(logIndex, FALSE); + } + else + { + GitRev *pRev = m_data.GetRev(line, GetLogData()->m_pLogCache->m_HashMap); + this->GetDocument()->GetMainFrame()->m_wndProperties.UpdateProperties(pRev); + } } else { @@ -1764,7 +1781,16 @@ void CTortoiseGitBlameView::OnMouseHover(UINT /*nFlags*/, CPoint point) if (line != m_MouseLine) { m_MouseLine = (LONG)line; - GitRev *pRev = &this->GetLogData()->GetGitRevAt(m_lineToLogIndex[line]); + GitRev *pRev = nullptr; + int logIndex = m_lineToLogIndex[line]; + if (logIndex >= 0) + pRev = &GetLogData()->GetGitRevAt(logIndex); + else + pRev = m_data.GetRev(line, GetLogData()->m_pLogCache->m_HashMap); + + if (!pRev) + return; + CString body = pRev->GetBody(); int maxLine = 15; int iline = 0; -- 2.11.4.GIT