From 325b86f6e245260437921e3d94163b338fd36a81 Mon Sep 17 00:00:00 2001 From: Sup Yut Sum Date: Tue, 19 Mar 2013 22:44:13 +0800 Subject: [PATCH] Fixed issue #1223: Workaround endless waiting when git.exe already exited Sync Dialog use buffer, learnt from Progress Dialog Signed-off-by: Sup Yut Sum --- src/Changelog.txt | 1 + src/TortoiseProc/ProgressDlg.cpp | 2 +- src/TortoiseProc/SyncDlg.cpp | 29 ++++++++++++++++++++++++++++- src/TortoiseProc/SyncDlg.h | 2 ++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/Changelog.txt b/src/Changelog.txt index b0f5d38a6..857f3256c 100644 --- a/src/Changelog.txt +++ b/src/Changelog.txt @@ -55,6 +55,7 @@ Released: unreleased * Fixed issue #1696: Fetch from switch dialog does not refresh branches list * Fixed issue #1701: Changing commit order in rebase dialog doesn't auto scroll * Fixed issue #1702: Original commit message is showen even though it is changed during rebase + * Fixed issue #1223: Workaround endless waiting when git.exe already exited = Release 1.8.1.0 = Released: 2013-02-07 diff --git a/src/TortoiseProc/ProgressDlg.cpp b/src/TortoiseProc/ProgressDlg.cpp index f45d17c4e..4ff18d258 100644 --- a/src/TortoiseProc/ProgressDlg.cpp +++ b/src/TortoiseProc/ProgressDlg.cpp @@ -183,7 +183,7 @@ UINT CProgressDlg::RunCmdList(CWnd *pWnd,std::vector &cmdlist,bool bSho if (bShowCommand) { - CStringA str = CUnicodeUtils::GetMulti(cmdlist[i].Trim() + _T("\n\n"), CP_UTF8); + CStringA str = CUnicodeUtils::GetMulti(cmdlist[i].Trim() + _T("\r\n\r\n"), CP_UTF8); for (int j = 0; j < str.GetLength(); ++j) { if(pdata) diff --git a/src/TortoiseProc/SyncDlg.cpp b/src/TortoiseProc/SyncDlg.cpp index 6c9b8273c..a55409666 100644 --- a/src/TortoiseProc/SyncDlg.cpp +++ b/src/TortoiseProc/SyncDlg.cpp @@ -1118,7 +1118,7 @@ void CSyncDlg::OnCbnEditchangeComboboxex() UINT CSyncDlg::ProgressThread() { m_startTick = GetTickCount(); - m_GitCmdStatus=CProgressDlg::RunCmdList(this,m_GitCmdList,true,NULL,&this->m_bAbort); + m_GitCmdStatus = CProgressDlg::RunCmdList(this, m_GitCmdList, true, NULL, &this->m_bAbort, &this->m_Databuf); InterlockedExchange(&m_bBlock, FALSE); return 0; } @@ -1128,6 +1128,7 @@ LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) { if(wParam == MSG_PROGRESSDLG_START) { + m_BufStart = 0; m_ctrlAnimate.Play(0, UINT_MAX, UINT_MAX); this->m_ctrlProgress.SetPos(0); if (m_pTaskbarList) @@ -1141,6 +1142,12 @@ LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) { DWORD tickSpent = GetTickCount() - m_startTick; CString strEndTime = CLoglistUtils::FormatDateAndTime(CTime::GetCurrentTime(), DATE_SHORTDATE, true, false); + + m_BufStart = 0; + m_Databuf.m_critSec.Lock(); + m_Databuf.clear(); + m_Databuf.m_critSec.Unlock(); + //m_bDone = true; m_ctrlAnimate.Stop(); m_ctrlProgress.SetPos(100); @@ -1177,6 +1184,26 @@ LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam) if(lParam != 0) ParserCmdOutput((char)lParam); + else + { + m_Databuf.m_critSec.Lock(); + for (int i = m_BufStart; i < m_Databuf.size(); ++i) + { + char c = m_Databuf[m_BufStart]; + ++m_BufStart; + m_Databuf.m_critSec.Unlock(); + ParserCmdOutput(c); + + m_Databuf.m_critSec.Lock(); + } + + if (m_BufStart > 1000) + { + m_Databuf.erase(m_Databuf.begin(), m_Databuf.begin() + m_BufStart); + m_BufStart = 0; + } + m_Databuf.m_critSec.Unlock(); + } return 0; } diff --git a/src/TortoiseProc/SyncDlg.h b/src/TortoiseProc/SyncDlg.h index d929828a1..4330f7c0c 100644 --- a/src/TortoiseProc/SyncDlg.h +++ b/src/TortoiseProc/SyncDlg.h @@ -109,6 +109,8 @@ protected: CWinThread* m_pThread; volatile LONG m_bBlock; + CGitByteArray m_Databuf; + int m_BufStart; void ParserCmdOutput(char ch); -- 2.11.4.GIT