return 0;\r
}\r
\r
-int CLogCache::GetCacheData(GitRev &Rev)\r
+GitRev * CLogCache::GetCacheData(CGitHash &hash)\r
{\r
- if(this->m_HashMapIndex.find(Rev.m_CommitHash)==m_HashMapIndex.end())\r
+ if(this->m_HashMapIndex.find(hash)==m_HashMapIndex.end())\r
{\r
- if(this->m_HashMap.IsExist(Rev.m_CommitHash))\r
+ if(this->m_HashMap.IsExist(hash))\r
{\r
- Rev.CopyFrom(m_HashMap[Rev.m_CommitHash]);\r
- return 0;\r
+ return &m_HashMap[hash];\r
}\r
- return -1;\r
+ return NULL;\r
}\r
else\r
{\r
- return LoadOneItem(Rev,m_HashMapIndex[Rev.m_CommitHash]);\r
+ GitRev rev;\r
+ if(!LoadOneItem(rev,m_HashMapIndex[hash]))\r
+ {\r
+ rev.m_IsFull=true;\r
+ m_HashMap[hash].CopyFrom(rev);\r
+ return &m_HashMap[hash];\r
+ }\r
}\r
- return 0;\r
+ return NULL;\r
}\r
int CLogCache::FetchCacheIndex(CString GitDir)\r
{\r
{\r
if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
{\r
- if((*i).second.m_IsFull)\r
+ if((*i).second.m_IsFull && !(*i).second.m_CommitHash.IsEmpty())\r
{\r
ULONGLONG offset = m_DataFile.GetPosition();\r
this->SaveOneItem((*i).second,offset);\r
\r
}\r
\r
-int CGitLogListBase::FillGitShortLog()\r
+int CGitLogListBase::BeginFetchLog()\r
{\r
ClearText();\r
\r
if(m_bShowWC)\r
this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev.m_CommitHash);\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);\r
\r
//this->m_logEntries.ParserFromLog();\r
if(IsInWorkingThread())\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.GetGitRevAt(i).m_CommitHash.IsEmpty())\r
- m_logEntries.GetGitRevAt(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
if(revInVector->m_IsFull)\r
return;\r
\r
- if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries.GetGitRevAt(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.GetGitRevAt(rev).m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(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
if(m_logEntries.GetGitRevAt(i).m_IsFull)\r
continue;\r
\r
- if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
+ GitRev *pRev = m_LogCache.GetCacheData(m_logEntries[i]);\r
+ if(pRev == NULL)\r
{\r
if(!m_logEntries.FetchFullInfo(i))\r
{\r
}else\r
{\r
updated++;\r
- InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_logEntries.GetGitRevAt(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
+ 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
+ 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
+ m_logEntries.push_back(hash);\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
+ if(t2-t1>500 && m_logEntries.size()<(oldsize+100) )\r
+ {\r
+ //update UI\r
+ oldsize = m_logEntries.size();\r
+ PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL);\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);\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
::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