2 #include "GitLogCache.h"
\r
4 CLogCache::CLogCache()
\r
9 CLogCache::~CLogCache()
\r
11 //this->m_IndexFile.Close();
\r
12 //this->m_DataFile.Close();
\r
14 int CLogCache::AddCacheEntry(GitRev &Rev)
\r
16 this->m_NewCacheEntry.push_back(Rev);
\r
20 int CLogCache::GetCacheData(GitRev &Rev)
\r
22 if(this->m_HashMapIndex.find(Rev.m_CommitHash)==m_HashMapIndex.end())
\r
24 for(int i=0;i<this->m_NewCacheEntry.size();i++)
\r
26 if(m_NewCacheEntry[i].m_CommitHash==Rev.m_CommitHash)
\r
28 Rev.CopyFrom(m_NewCacheEntry[i],true);
\r
36 return LoadOneItem(Rev,m_HashMapIndex[Rev.m_CommitHash]);
\r
40 int CLogCache::FetchCacheIndex(CString GitDir)
\r
43 if(this->m_IndexFile.m_hFile == CFile::hFileNull)
\r
45 BOOL b=m_IndexFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
\r
46 CFile::modeRead|CFile::shareDenyNone|
\r
47 CFile::modeNoTruncate|CFile::modeCreate);
\r
51 //Cache has been fetched.
\r
52 //if(m_GitDir == GitDir)
\r
56 m_IndexFile.SeekToBegin();
\r
58 SLogCacheIndexHeader header;
\r
59 UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));
\r
60 if(count != sizeof(SLogCacheIndexHeader))
\r
63 if( header.m_Magic != LOG_INDEX_MAGIC )
\r
66 if( header.m_Version != LOG_INDEX_VERSION )
\r
72 //for(int i=0;i<header.m_ItemCount;i++)
\r
73 this->m_HashMapIndex.clear();
\r
77 count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem));
\r
78 if( count != sizeof(SLogCacheItem) )
\r
82 g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);
\r
83 this->m_HashMapIndex[str]=Item.m_Offset;
\r
89 int CLogCache::SaveOneItem(GitRev &Rev,ULONGLONG offset)
\r
92 SLogCacheRevItemHeader header;
\r
93 m_DataFile.Seek(offset,CFile::begin);
\r
95 if(this->m_DataFile.m_hFile == CFile::hFileNull)
\r
97 BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
\r
98 CFile::modeRead|CFile::shareDenyNone|
\r
99 CFile::modeNoTruncate|CFile::modeCreate);
\r
104 header.m_Magic=LOG_DATA_ITEM_MAGIC;
\r
105 header.m_Version=LOG_INDEX_VERSION;
\r
106 header.m_FileCount=Rev.m_Files.GetCount();
\r
108 m_DataFile.Write(&header,sizeof(SLogCacheRevItemHeader));
\r
110 CArchive ar(&m_DataFile, CArchive::store);
\r
112 ar<<Rev.m_AuthorName;
\r
113 ar<<Rev.m_AuthorEmail;
\r
114 ar<<Rev.m_AuthorDate;
\r
115 ar<<Rev.m_CommitterName;
\r
116 ar<<Rev.m_CommitterEmail;
\r
117 ar<<Rev.m_CommitterDate;
\r
120 ar<<Rev.m_CommitHash;
\r
123 for(int i=0;i<Rev.m_Files.GetCount();i++)
\r
125 SLogCacheRevFileHeader header;
\r
126 header.m_Magic=LOG_DATA_FILE_MAGIC;
\r
127 header.m_Version=LOG_INDEX_VERSION;
\r
129 ar<<header.m_Magic;
\r
130 ar<<header.m_Version;
\r
131 ar<<Rev.m_Files[i].GetGitPathString();
\r
132 ar<<Rev.m_Files[i].m_Action;
\r
133 ar<<Rev.m_Files[i].m_Stage;
\r
134 ar<<Rev.m_Files[i].m_StatAdd;
\r
135 ar<<Rev.m_Files[i].m_StatDel;
\r
141 int CLogCache::LoadOneItem(GitRev &Rev,ULONGLONG offset)
\r
143 SLogCacheRevItemHeader header;
\r
145 if(this->m_DataFile.m_hFile == CFile::hFileNull)
\r
147 BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,
\r
148 CFile::modeRead|CFile::shareDenyNone|
\r
149 CFile::modeNoTruncate|CFile::modeCreate);
\r
153 m_DataFile.Seek(offset,CFile::begin);
\r
155 UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevItemHeader));
\r
156 if( count != sizeof(SLogCacheRevItemHeader))
\r
158 if( !CheckHeader(header))
\r
162 CArchive ar(&m_DataFile, CArchive::load);
\r
164 ar>>Rev.m_AuthorName;
\r
165 ar>>Rev.m_AuthorEmail;
\r
166 ar>>Rev.m_AuthorDate;
\r
167 ar>>Rev.m_CommitterName;
\r
168 ar>>Rev.m_CommitterEmail;
\r
169 ar>>Rev.m_CommitterDate;
\r
172 ar>>Rev.m_CommitHash;
\r
175 Rev.m_Files.Clear();
\r
177 for(int i=0;i<header.m_FileCount;i++)
\r
182 SLogCacheRevFileHeader header;
\r
184 ar>>header.m_Magic;
\r
185 ar>>header.m_Version;
\r
187 if( this->CheckHeader(header) )
\r
190 path.SetFromGit(file);
\r
194 ar>>path.m_StatAdd;
\r
195 ar>>path.m_StatDel;
\r
198 Rev.m_Files.AddPath(path);
\r
202 int CLogCache::RebuildCacheFile()
\r
204 m_IndexFile.SetLength(0);
\r
205 m_DataFile.SetLength(0);
\r
207 SLogCacheIndexHeader header;
\r
208 header.m_Magic=LOG_INDEX_MAGIC;
\r
209 header.m_Version=LOG_INDEX_VERSION;
\r
210 m_IndexFile.SeekToBegin();
\r
211 m_IndexFile.Write(&header,sizeof(SLogCacheIndexHeader));
\r
215 SLogCacheRevFileHeader header;
\r
216 header.m_Magic=LOG_DATA_MAGIC;
\r
217 header.m_Version=LOG_INDEX_VERSION;
\r
219 m_DataFile.SeekToBegin();
\r
220 m_DataFile.Write(&header,sizeof(SLogCacheRevFileHeader));
\r
224 int CLogCache::SaveCache()
\r
226 bool bIsRebuild=false;
\r
227 if(this->m_DataFile.m_hFile != CFile::hFileNull)
\r
228 m_DataFile.Close();
\r
229 if(this->m_IndexFile.m_hFile!=CFile::hFileNull)
\r
230 m_IndexFile.Close();
\r
232 if(this->m_IndexFile.m_hFile == CFile::hFileNull)
\r
234 BOOL b=m_IndexFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
\r
235 CFile::modeReadWrite|CFile::shareDenyWrite|
\r
236 CFile::modeNoTruncate|CFile::modeCreate);
\r
241 if(this->m_DataFile.m_hFile == CFile::hFileNull)
\r
243 BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,
\r
244 CFile::modeReadWrite|CFile::shareDenyWrite|
\r
245 CFile::modeNoTruncate|CFile::modeCreate);
\r
250 m_IndexFile.Close();
\r
256 SLogCacheIndexHeader header;
\r
257 memset(&header,0,sizeof(SLogCacheIndexHeader));
\r
258 UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));
\r
259 if(count != sizeof(SLogCacheIndexHeader) || !this->CheckHeader(header))
\r
261 RebuildCacheFile();
\r
268 SLogCacheRevFileHeader header;
\r
270 UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevFileHeader));
\r
271 if( count != sizeof(SLogCacheRevFileHeader) || !CheckHeader(header))
\r
273 RebuildCacheFile();
\r
279 m_DataFile.SeekToEnd();
\r
280 m_IndexFile.SeekToEnd();
\r
281 for(int i=0;i<this->m_NewCacheEntry.size();i++)
\r
283 if(this->m_HashMapIndex.find(m_NewCacheEntry[i].m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)
\r
285 ULONGLONG offset = m_DataFile.GetPosition();
\r
286 this->SaveOneItem(m_NewCacheEntry[i],offset);
\r
288 SLogCacheItem item;
\r
289 for(int j=0; j<40;j++)
\r
290 item.m_Hash[j]=(BYTE)m_NewCacheEntry[i].m_CommitHash[j];
\r
291 item.m_Offset=offset;
\r
293 m_IndexFile.Write(&item,sizeof(SLogCacheItem));
\r
296 m_IndexFile.Close();
\r
297 m_DataFile.Close();
\r