}\r
int CLogCache::AddCacheEntry(GitRev &Rev)\r
{\r
- this->m_NewCacheEntry.push_back(Rev);\r
+ this->m_HashMap[Rev.m_CommitHash] = Rev;\r
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
- for(int i=0;i<this->m_NewCacheEntry.size();i++)\r
+ if(this->m_HashMap.IsExist(hash))\r
{\r
- if(m_NewCacheEntry[i].m_CommitHash==Rev.m_CommitHash)\r
- {\r
- Rev.CopyFrom(m_NewCacheEntry[i],true);\r
- return 0;\r
- }\r
+ return &m_HashMap[hash];\r
}\r
- return -1;\r
+ m_HashMap[hash].m_CommitHash=hash;\r
+ return &m_HashMap[hash];\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
+ m_HashMap[hash].CopyFrom(rev);\r
+ m_HashMap[hash].m_IsFull=true;\r
+ \r
+ return &m_HashMap[hash];\r
+ }\r
}\r
- return 0;\r
+ m_HashMap[hash].m_CommitHash=hash;\r
+ return &m_HashMap[hash];\r
}\r
int CLogCache::FetchCacheIndex(CString GitDir)\r
{\r
if( count != sizeof(SLogCacheItem) )\r
break;\r
\r
- CString str;\r
- g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);\r
- this->m_HashMapIndex[str]=Item.m_Offset;\r
+ this->m_HashMapIndex[Item.m_Hash]=Item.m_Offset;\r
}\r
\r
return 0;\r
ar<<header.m_Magic;\r
ar<<header.m_Version;\r
ar<<Rev.m_Files[i].GetGitPathString();\r
+ ar<<Rev.m_Files[i].GetGitOldPathString();\r
ar<<Rev.m_Files[i].m_Action;\r
ar<<Rev.m_Files[i].m_Stage;\r
ar<<Rev.m_Files[i].m_StatAdd;\r
for(int i=0;i<header.m_FileCount;i++)\r
{\r
CTGitPath path;\r
- CString file;\r
+ CString file,oldfile;\r
path.Reset();\r
SLogCacheRevFileHeader header;\r
\r
if( this->CheckHeader(header) )\r
return -1;\r
ar>>file;\r
- path.SetFromGit(file);\r
+ ar>>oldfile;\r
+ path.SetFromGit(file,&oldfile);\r
\r
ar>>path.m_Action;\r
ar>>path.m_Stage;\r
}\r
int CLogCache::SaveCache()\r
{\r
+ if( this->m_HashMap.size() == 0 )\r
+ return 0;\r
+\r
+ if( this->m_GitDir.IsEmpty())\r
+ return 0;\r
+\r
bool bIsRebuild=false;\r
if(this->m_DataFile.m_hFile != CFile::hFileNull)\r
m_DataFile.Close();\r
\r
m_DataFile.SeekToEnd();\r
m_IndexFile.SeekToEnd();\r
- for(int i=0;i<this->m_NewCacheEntry.size();i++)\r
+ CGitHashMap::iterator i;\r
+ for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
{\r
- if(this->m_HashMapIndex.find(m_NewCacheEntry[i].m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
+ if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
{\r
- ULONGLONG offset = m_DataFile.GetPosition();\r
- this->SaveOneItem(m_NewCacheEntry[i],offset);\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
- SLogCacheItem item;\r
- for(int j=0; j<40;j++)\r
- item.m_Hash[j]=(BYTE)m_NewCacheEntry[i].m_CommitHash[j];\r
- item.m_Offset=offset;\r
+ SLogCacheItem item;\r
+ item.m_Hash = (*i).second.m_CommitHash;\r
+ item.m_Offset=offset;\r
\r
- m_IndexFile.Write(&item,sizeof(SLogCacheItem));\r
+ m_IndexFile.Write(&item,sizeof(SLogCacheItem));\r
+ }\r
}\r
}\r
m_IndexFile.Close();\r
m_DataFile.Close();\r
return 0;\r
+}\r
+\r
+int CLogCache::ClearAllParent()\r
+{\r
+ CGitHashMap::iterator i;\r
+ for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
+ {\r
+ (*i).second.m_ParentHash.clear();\r
+ (*i).second.m_Lanes.clear();\r
+ }\r
+ return 0;\r
}
\ No newline at end of file