+}\r
+int CLogCache::RebuildCacheFile()\r
+{\r
+ m_IndexFile.SetLength(0);\r
+ m_DataFile.SetLength(0);\r
+ {\r
+ SLogCacheIndexHeader header;\r
+ header.m_Magic=LOG_INDEX_MAGIC;\r
+ header.m_Version=LOG_INDEX_VERSION;\r
+ m_IndexFile.SeekToBegin();\r
+ m_IndexFile.Write(&header,sizeof(SLogCacheIndexHeader));\r
+ }\r
+ \r
+ {\r
+ SLogCacheRevFileHeader header;\r
+ header.m_Magic=LOG_DATA_MAGIC;\r
+ header.m_Version=LOG_INDEX_VERSION;\r
+\r
+ m_DataFile.SeekToBegin();\r
+ m_DataFile.Write(&header,sizeof(SLogCacheRevFileHeader));\r
+ }\r
+ return 0;\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
+ if(this->m_IndexFile.m_hFile!=CFile::hFileNull)\r
+ m_IndexFile.Close();\r
+\r
+ if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
+ {\r
+ BOOL b=m_IndexFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
+ CFile::modeReadWrite|CFile::shareDenyWrite|\r
+ CFile::modeNoTruncate|CFile::modeCreate);\r
+ if(!b)\r
+ return -1;\r
+ }\r
+\r
+ if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
+ {\r
+ BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,\r
+ CFile::modeReadWrite|CFile::shareDenyWrite|\r
+ CFile::modeNoTruncate|CFile::modeCreate);\r
+\r
+ \r
+ if(!b)\r
+ {\r
+ m_IndexFile.Close();\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ {\r
+ SLogCacheIndexHeader header;\r
+ memset(&header,0,sizeof(SLogCacheIndexHeader));\r
+ UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));\r
+ if(count != sizeof(SLogCacheIndexHeader) || !this->CheckHeader(header))\r
+ {// new file\r
+ RebuildCacheFile();\r
+ bIsRebuild=true;\r
+ }\r
+ }\r
+\r
+ {\r
+\r
+ SLogCacheRevFileHeader header;\r
+ \r
+ UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevFileHeader));\r
+ if( count != sizeof(SLogCacheRevFileHeader) || !CheckHeader(header))\r
+ {\r
+ RebuildCacheFile();\r
+ bIsRebuild=true;\r
+ }\r
+ \r
+ }\r
+\r
+ m_DataFile.SeekToEnd();\r
+ m_IndexFile.SeekToEnd();\r
+ CGitHashMap::iterator i;\r
+ for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
+ {\r
+ if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
+ {\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
+ item.m_Hash = (*i).second.m_CommitHash;\r
+ item.m_Offset=offset;\r
+\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