, m_nSelectedFilter(LOGFILTER_ALL)\r
, m_bVista(false)\r
, m_bShowWC(false)\r
+ , m_logEntries(&m_LogCache)\r
{\r
// use the default GUI font, create a copy of it and\r
// change the copy to BOLD (leave the rest of the font\r
\r
m_IsIDReplaceAction=FALSE;\r
\r
- m_wcRev.m_CommitHash=GIT_REV_ZERO;\r
+ this->m_critSec.Init();\r
+ m_wcRev.m_CommitHash.Empty();\r
m_wcRev.m_Subject=_T("Working dir changes");\r
m_wcRev.m_ParentHash.clear();\r
m_wcRev.m_Mark=_T('-');\r
*pResult = CDRF_NOTIFYSUBITEMDRAW | CDRF_NEWFONT;\r
}\r
\r
- if(data->m_CommitHash == m_HeadHash)\r
+ if(data->m_CommitHash.ToString() == m_HeadHash)\r
{\r
SelectObject(pLVCD->nmcd.hdc, m_boldFont);\r
*pResult = CDRF_NOTIFYSUBITEMDRAW | CDRF_NEWFONT;\r
// if ((data->childStackDepth)||(m_mergedRevs.find(data->Rev) != m_mergedRevs.end()))\r
// crText = GetSysColor(COLOR_GRAYTEXT);\r
// \r
- if (data->m_CommitHash == GIT_REV_ZERO)\r
+ if (data->m_CommitHash.IsEmpty())\r
{\r
//crText = GetSysColor(RGB(200,200,0));\r
//SelectObject(pLVCD->nmcd.hdc, m_boldFont);\r
FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);\r
\r
GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);\r
- if( data ->m_CommitHash != GIT_REV_ZERO)\r
+ if( !data ->m_CommitHash.IsEmpty())\r
DrawGraph(pLVCD->nmcd.hdc,rect,pLVCD->nmcd.dwItemSpec);\r
\r
*pResult = CDRF_SKIPDEFAULT;\r
lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_AuthorName, pItem->cchTextMax);\r
break;\r
case this->LOGLIST_DATE: //Date\r
- if (pLogEntry && pLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if ( pLogEntry && (!pLogEntry->m_CommitHash.IsEmpty()) )\r
lstrcpyn(pItem->pszText,\r
CAppUtils::FormatDateAndTime( pLogEntry->m_AuthorDate, m_DateFormat, true, m_bRelativeTimes ), \r
pItem->cchTextMax);\r
{\r
\r
{\r
- if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if( !pSelLogEntry->m_CommitHash.IsEmpty())\r
{\r
if(m_ContextMenuMask&GetContextMenuBit(ID_COMPARE))\r
popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARE, IDI_DIFF);\r
format.LoadString(IDS_RESET_TO_THIS_FORMAT);\r
str.Format(format,g_Git.GetCurrentBranch());\r
\r
- if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if(!pSelLogEntry->m_CommitHash.IsEmpty())\r
{\r
if(m_ContextMenuMask&GetContextMenuBit(ID_RESET))\r
popup.AppendMenuIcon(ID_RESET,str,IDI_REVERT);\r
popup.AppendMenu(MF_SEPARATOR, NULL);\r
}\r
\r
- if ( GetSelectedCount() >0 && pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if ( GetSelectedCount() >0 && (!pSelLogEntry->m_CommitHash.IsEmpty()))\r
{\r
if ( IsSelectionContinuous() && GetSelectedCount() >= 2 )\r
{\r
CString hash=g_Git.GetHash(head);\r
hash=hash.Left(40);\r
GitRev* pLastEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
- if(pLastEntry->m_CommitHash == hash)\r
+ if(pLastEntry->m_CommitHash.ToString() == hash)\r
popup.AppendMenuIcon(ID_COMBINE_COMMIT,IDS_COMBINE_TO_ONE,IDI_COMBINE);\r
}\r
}\r
{\r
if(m_IsOldFirst)\r
{\r
- m_logEntries[m_logEntries.size()-i-1].m_IsFull=TRUE;\r
+ m_logEntries.GetGitRevAt(m_logEntries.size()-i-1).m_IsFull=TRUE;\r
this->m_arShownList.Add(&m_logEntries[m_logEntries.size()-i-1]);\r
\r
}else\r
{\r
- m_logEntries[i].m_IsFull=TRUE;\r
+ m_logEntries.GetGitRevAt(i).m_IsFull=TRUE;\r
this->m_arShownList.Add(&m_logEntries[i]);\r
}\r
}\r
\r
}\r
\r
-int CGitLogListBase::FillGitShortLog()\r
+int CGitLogListBase::BeginFetchLog()\r
{\r
ClearText();\r
\r
this->m_logEntries.ClearAll();\r
+ git_init();\r
\r
m_LogCache.FetchCacheIndex(g_Git.m_CurrentDir);\r
\r
// if(this->m_bAllBranch)\r
mask |= m_ShowMask;\r
\r
+ this->m_arShownList.RemoveAll();\r
+\r
if(m_bShowWC)\r
- this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev);\r
+ {\r
+ this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev.m_CommitHash);\r
+ this->m_LogCache.m_HashMap[m_wcRev.m_CommitHash]=m_wcRev;\r
+ }\r
\r
- this->m_logEntries.FetchShortLog(path,m_StartRef,-1,mask,m_bShowWC?1:0);\r
+ CString cmd=g_Git.GetLogCmd(m_StartRef,path,-1,mask,NULL,NULL,true);\r
\r
//this->m_logEntries.ParserFromLog();\r
if(IsInWorkingThread())\r
{\r
SetItemCountEx(this->m_logEntries.size());\r
}\r
-\r
- this->m_arShownList.RemoveAll();\r
-\r
- for(unsigned int i=0;i<m_logEntries.size();i++)\r
+ \r
+ if(git_open_log(&m_DllGitLog,CUnicodeUtils::GetMulti(cmd,CP_ACP).GetBuffer()))\r
{\r
- if(i>0 || m_logEntries[i].m_CommitHash != GIT_REV_ZERO)\r
- m_logEntries[i].m_Subject=_T("parser...");\r
-\r
- if(this->m_IsOldFirst)\r
- {\r
- this->m_arShownList.Add(&m_logEntries[m_logEntries.size()-1-i]);\r
-\r
- }else\r
- {\r
- this->m_arShownList.Add(&m_logEntries[i]);\r
- }\r
+ return -1;\r
}\r
+\r
return 0;\r
}\r
\r
latest=CTime(1971,1,2,0,0,0);\r
for(unsigned int i=0;i<m_logEntries.size();i++)\r
{\r
- if(m_logEntries[i].m_AuthorDate.GetTime() < oldest.GetTime())\r
- oldest = m_logEntries[i].m_AuthorDate.GetTime();\r
+ if(m_logEntries[i].IsEmpty())\r
+ continue;\r
+\r
+ if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() < oldest.GetTime())\r
+ oldest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
\r
- if(m_logEntries[i].m_AuthorDate.GetTime() > latest.GetTime())\r
- latest = m_logEntries[i].m_AuthorDate.GetTime();\r
+ if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() > latest.GetTime())\r
+ latest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
\r
}\r
}\r
}\r
//Set updating\r
int rev=itRev->second;\r
- GitRev* revInVector=&m_ploglist->m_logEntries[rev];\r
+ GitRev* revInVector=&m_ploglist->m_logEntries.GetGitRevAt(rev);\r
\r
\r
if(revInVector->m_IsFull)\r
return;\r
\r
- if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries[rev]))\r
+ GitRev *pRev= m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries[rev]);\r
+ if(pRev)\r
{\r
++m_CollectedCount;\r
- InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsFull,TRUE);\r
+ InterlockedExchange(&pRev->m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&pRev->m_IsFull,TRUE);\r
::PostMessage(m_ploglist->m_hWnd,MSG_LOADED,(WPARAM)rev,0);\r
return;\r
}\r
{\r
for(unsigned int i=0;i<m_logEntries.size();i++)\r
{\r
- if(m_logEntries[i].m_IsFull)\r
+ if(m_logEntries.GetGitRevAt(i).m_IsFull)\r
continue;\r
\r
- if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+ GitRev *pRev = m_LogCache.GetCacheData(m_logEntries[i]);\r
+ if(pRev == NULL)\r
{\r
if(!m_logEntries.FetchFullInfo(i))\r
{\r
updated++;\r
}\r
- m_LogCache.AddCacheEntry(m_logEntries[i]);\r
+ m_LogCache.AddCacheEntry(m_logEntries.GetGitRevAt(i));\r
\r
}else\r
{\r
updated++;\r
- InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+ InterlockedExchange(&pRev->m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&pRev->m_IsFull,TRUE);\r
}\r
\r
::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)i,0);\r
\r
UINT CGitLogListBase::LogThread()\r
{\r
+ ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_START,0);\r
+ \r
+ InterlockedExchange(&m_bThreadRunning, TRUE);\r
+ InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
+\r
+ ULONGLONG t1,t2;\r
+ \r
+ if(BeginFetchLog())\r
+ return -1;\r
\r
+ //Update work copy item;\r
+ if( m_logEntries.size() > 0)\r
+ {\r
+ GitRev *pRev = &m_logEntries.GetGitRevAt(0);\r
+ \r
+ m_arShownList.Add(pRev);\r
+\r
+ if( pRev->m_CommitHash.IsEmpty() )\r
+ {\r
+ pRev->m_Files.Clear();\r
+ pRev->m_ParentHash.clear();\r
+ pRev->m_ParentHash.push_back(m_HeadHash);\r
+ g_Git.GetCommitDiffList(pRev->m_CommitHash.ToString(),this->m_HeadHash, pRev->m_Files);\r
+ pRev->m_Action =0;\r
+ \r
+ for(int j=0;j< pRev->m_Files.GetCount();j++)\r
+ pRev->m_Action |= pRev->m_Files[j].m_Action;\r
+ \r
+ pRev->m_Body.Format(_T("%d files changed"),m_logEntries.GetGitRevAt(0).m_Files.GetCount());\r
+ ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)0,0);\r
+ }\r
+ }\r
+\r
+ InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+\r
+ git_get_log_firstcommit(m_DllGitLog);\r
+ GIT_COMMIT commit;\r
+ t1=GetTickCount();\r
+\r
+ int oldsize=m_logEntries.size();\r
+ while( git_get_log_nextcommit(this->m_DllGitLog,&commit) == 0)\r
+ {\r
+ //printf("%s\r\n",commit.m_Subject);\r
+ if(m_bExitThread)\r
+ break;\r
+\r
+ CGitHash hash = (char*)commit.m_hash ;\r
+\r
+ \r
+ GitRev *pRev = m_LogCache.GetCacheData(hash);\r
+ \r
+ if(pRev == NULL || !pRev->m_IsFull)\r
+ {\r
+ pRev->ParserFromCommit(&commit);\r
+ pRev->ParserParentFromCommit(&commit);\r
+\r
+ pRev->SafeFetchFullInfo(&g_Git);\r
+ git_free_commit(&commit);\r
+ \r
+ }else\r
+ {\r
+ ASSERT(pRev->m_CommitHash == hash);\r
+ pRev->ParserParentFromCommit(&commit);\r
+ }\r
+\r
+ this->m_critSec.Lock();\r
+ m_logEntries.push_back(hash);\r
+ m_arShownList.Add(pRev);\r
+ this->m_critSec.Unlock();\r
+\r
+ if(t2-t1>500 )\r
+ {\r
+ //update UI\r
+ oldsize = m_logEntries.size();\r
+ PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL|LVSICF_NOSCROLL);\r
+ ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_END,0);\r
+ } \r
+ }\r
+ \r
+ //Update UI;\r
+ PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL|LVSICF_NOSCROLL);\r
+ ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_END,0);\r
+\r
+ InterlockedExchange(&m_bThreadRunning, FALSE);\r
+\r
+#if 0\r
// if(m_ProcCallBack)\r
// m_ProcCallBack(m_ProcData,GITLOG_START);\r
::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_START,0);\r
int update=0;\r
for(int i=0;i<m_logEntries.size();i++)\r
{\r
- if( i==0 && m_logEntries[i].m_CommitHash == GIT_REV_ZERO)\r
+ if( i==0 && m_logEntries.GetGitRevAt(i).m_CommitHash.IsEmpty() )\r
{\r
- m_logEntries[i].m_Files.Clear();\r
- m_logEntries[i].m_ParentHash.clear();\r
- m_logEntries[i].m_ParentHash.push_back(m_HeadHash);\r
- g_Git.GetCommitDiffList(m_logEntries[i].m_CommitHash,this->m_HeadHash,m_logEntries[i].m_Files);\r
- m_logEntries[i].m_Action =0;\r
- for(int j=0;j< m_logEntries[i].m_Files.GetCount();j++)\r
- m_logEntries[i].m_Action |= m_logEntries[i].m_Files[j].m_Action;\r
+ m_logEntries.GetGitRevAt(i).m_Files.Clear();\r
+ m_logEntries.GetGitRevAt(i).m_ParentHash.clear();\r
+ m_logEntries.GetGitRevAt(i).m_ParentHash.push_back(m_HeadHash);\r
+ g_Git.GetCommitDiffList(m_logEntries.GetGitRevAt(i).m_CommitHash.ToString(),this->m_HeadHash,m_logEntries.GetGitRevAt(i).m_Files);\r
+ m_logEntries.GetGitRevAt(i).m_Action =0;\r
+ for(int j=0;j< m_logEntries.GetGitRevAt(i).m_Files.GetCount();j++)\r
+ m_logEntries.GetGitRevAt(i).m_Action |= m_logEntries.GetGitRevAt(i).m_Files[j].m_Action;\r
\r
- m_logEntries[i].m_Body.Format(_T("%d files changed"),m_logEntries[i].m_Files.GetCount());\r
+ m_logEntries.GetGitRevAt(i).m_Body.Format(_T("%d files changed"),m_logEntries.GetGitRevAt(i).m_Files.GetCount());\r
::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)0,0);\r
continue;\r
}\r
\r
- start=this->m_logEntries[i].ParserFromLog(m_logEntries.m_RawlogData,start);\r
- m_logEntries.m_HashMap[m_logEntries[i].m_CommitHash]=i;\r
+ start=this->m_logEntries.GetGitRevAt(i).ParserFromLog(m_logEntries.m_RawlogData,start);\r
+ m_logEntries.m_HashMap[m_logEntries.GetGitRevAt(i).m_CommitHash.ToString()]=i;\r
\r
- if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+ if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
{\r
if(firstcommit.IsEmpty())\r
- firstcommit=m_logEntries[i].m_CommitHash;\r
- lastcommit=m_logEntries[i].m_CommitHash;\r
+ firstcommit=m_logEntries.GetGitRevAt(i).m_CommitHash.ToString();\r
+ lastcommit=m_logEntries.GetGitRevAt(i).m_CommitHash.ToString();\r
\r
}else\r
{\r
- InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsFull,TRUE);\r
update++;\r
}\r
+ ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM) i, 0);\r
+\r
if(start<0)\r
break;\r
if(start>=m_logEntries.m_RawlogData.size())\r
int percent=i*30/m_logEntries.size() + GITLOG_START+1;\r
\r
::PostMessage(GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) percent, 0);\r
- ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM) i, 0);\r
\r
if(this->m_bExitThread)\r
{ \r
::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_END,0);\r
\r
InterlockedExchange(&m_bThreadRunning, FALSE);\r
-\r
+#endif\r
return 0;\r
}\r
\r
#endif\r
if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_MESSAGES))\r
{\r
- ATLTRACE(_T("messge = \"%s\"\n"),m_logEntries[i].m_Subject);\r
- if (regex_search(wstring((LPCTSTR)m_logEntries[i].m_Subject), pat, flags)&&IsEntryInDateRange(i))\r
+ ATLTRACE(_T("messge = \"%s\"\n"),m_logEntries.GetGitRevAt(i).m_Subject);\r
+ if (regex_search(wstring((LPCTSTR)m_logEntries.GetGitRevAt(i).m_Subject), pat, flags)&&IsEntryInDateRange(i))\r
{\r
pShownlist->Add(&m_logEntries[i]);\r
continue;\r
}\r
\r
- ATLTRACE(_T("messge = \"%s\"\n"),m_logEntries[i].m_Body);\r
- if (regex_search(wstring((LPCTSTR)m_logEntries[i].m_Body), pat, flags)&&IsEntryInDateRange(i))\r
+ ATLTRACE(_T("messge = \"%s\"\n"),m_logEntries.GetGitRevAt(i).m_Body);\r
+ if (regex_search(wstring((LPCTSTR)m_logEntries.GetGitRevAt(i).m_Body), pat, flags)&&IsEntryInDateRange(i))\r
{\r
- pShownlist->Add(&m_logEntries[i]);\r
+ pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
continue;\r
}\r
}\r
#endif\r
if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_AUTHORS))\r
{\r
- if (regex_search(wstring((LPCTSTR)m_logEntries[i].m_AuthorName), pat, flags)&&IsEntryInDateRange(i))\r
+ if (regex_search(wstring((LPCTSTR)m_logEntries.GetGitRevAt(i).m_AuthorName), pat, flags)&&IsEntryInDateRange(i))\r
{\r
- pShownlist->Add(&m_logEntries[i]);\r
+ pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
continue;\r
}\r
}\r
if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_REVS))\r
{\r
- sRev.Format(_T("%s"), m_logEntries[i].m_CommitHash);\r
+ sRev.Format(_T("%s"), m_logEntries.GetGitRevAt(i).m_CommitHash);\r
if (regex_search(wstring((LPCTSTR)sRev), pat, flags)&&IsEntryInDateRange(i))\r
{\r
- pShownlist->Add(&m_logEntries[i]);\r
+ pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
continue;\r
}\r
}\r
#endif\r
if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_MESSAGES))\r
{\r
- CString msg = m_logEntries[i].m_Subject;\r
+ CString msg = m_logEntries.GetGitRevAt(i).m_Subject;\r
\r
msg = msg.MakeLower();\r
if ((msg.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
{\r
- pShownlist->Add(&m_logEntries[i]);\r
+ pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
continue;\r
}\r
- msg = m_logEntries[i].m_Body;\r
+ msg = m_logEntries.GetGitRevAt(i).m_Body;\r
\r
msg = msg.MakeLower();\r
if ((msg.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
#endif\r
if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_AUTHORS))\r
{\r
- CString msg = m_logEntries[i].m_AuthorName;\r
+ CString msg = m_logEntries.GetGitRevAt(i).m_AuthorName;\r
msg = msg.MakeLower();\r
if ((msg.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
{\r
- pShownlist->Add(&m_logEntries[i]);\r
+ pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
continue;\r
}\r
}\r
if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_REVS))\r
{\r
- sRev.Format(_T("%s"), m_logEntries[i].m_CommitHash);\r
+ sRev.Format(_T("%s"), m_logEntries.GetGitRevAt(i).m_CommitHash);\r
if ((sRev.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
{\r
- pShownlist->Add(&m_logEntries[i]);\r
+ pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
continue;\r
}\r
}\r
\r
BOOL CGitLogListBase::IsEntryInDateRange(int i)\r
{\r
- __time64_t time = m_logEntries[i].m_AuthorDate.GetTime();\r
+ __time64_t time = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
if ((time >= m_From.GetTime())&&(time <= m_To.GetTime()))\r
return TRUE;\r
\r
GitRev *pRev = (GitRev*)m_arShownList[i];\r
if(pRev)\r
{\r
- if(pRev->m_CommitHash == m_HeadHash )\r
+ if(pRev->m_CommitHash.ToString() == m_HeadHash )\r
return i;\r
}\r
}\r