2 #include "GitLogCache.h"
9 CLogCache::~CLogCache()
11 //this->m_IndexFile.Close();
12 //this->m_DataFile.Close();
14 int CLogCache::AddCacheEntry(GitRev
&Rev
)
16 this->m_HashMap
[Rev
.m_CommitHash
] = Rev
;
20 int CLogCache::GetCacheData(GitRev
&Rev
)
22 if(this->m_HashMapIndex
.find(Rev
.m_CommitHash
)==m_HashMapIndex
.end())
24 if(this->m_HashMap
.IsExist(Rev
.m_CommitHash
))
26 Rev
.CopyFrom(m_HashMap
[Rev
.m_CommitHash
]);
33 return LoadOneItem(Rev
,m_HashMapIndex
[Rev
.m_CommitHash
]);
37 int CLogCache::FetchCacheIndex(CString GitDir
)
40 if(this->m_IndexFile
.m_hFile
== CFile::hFileNull
)
42 BOOL b
=m_IndexFile
.Open(GitDir
+_T("\\.git\\")+INDEX_FILE_NAME
,
43 CFile::modeRead
|CFile::shareDenyNone
|
44 CFile::modeNoTruncate
|CFile::modeCreate
);
48 //Cache has been fetched.
49 //if(m_GitDir == GitDir)
53 m_IndexFile
.SeekToBegin();
55 SLogCacheIndexHeader header
;
56 UINT count
=m_IndexFile
.Read(&header
,sizeof(SLogCacheIndexHeader
));
57 if(count
!= sizeof(SLogCacheIndexHeader
))
60 if( header
.m_Magic
!= LOG_INDEX_MAGIC
)
63 if( header
.m_Version
!= LOG_INDEX_VERSION
)
69 //for(int i=0;i<header.m_ItemCount;i++)
70 this->m_HashMapIndex
.clear();
74 count
=m_IndexFile
.Read(&Item
,sizeof(SLogCacheItem
));
75 if( count
!= sizeof(SLogCacheItem
) )
78 this->m_HashMapIndex
[Item
.m_Hash
]=Item
.m_Offset
;
84 int CLogCache::SaveOneItem(GitRev
&Rev
,ULONGLONG offset
)
87 SLogCacheRevItemHeader header
;
88 m_DataFile
.Seek(offset
,CFile::begin
);
90 if(this->m_DataFile
.m_hFile
== CFile::hFileNull
)
92 BOOL b
=m_DataFile
.Open(m_GitDir
+_T("\\.git\\")+INDEX_FILE_NAME
,
93 CFile::modeRead
|CFile::shareDenyNone
|
94 CFile::modeNoTruncate
|CFile::modeCreate
);
99 header
.m_Magic
=LOG_DATA_ITEM_MAGIC
;
100 header
.m_Version
=LOG_INDEX_VERSION
;
101 header
.m_FileCount
=Rev
.m_Files
.GetCount();
103 m_DataFile
.Write(&header
,sizeof(SLogCacheRevItemHeader
));
105 CArchive
ar(&m_DataFile
, CArchive::store
);
107 ar
<<Rev
.m_AuthorName
;
108 ar
<<Rev
.m_AuthorEmail
;
109 ar
<<Rev
.m_AuthorDate
;
110 ar
<<Rev
.m_CommitterName
;
111 ar
<<Rev
.m_CommitterEmail
;
112 ar
<<Rev
.m_CommitterDate
;
115 ar
<<Rev
.m_CommitHash
;
118 for(int i
=0;i
<Rev
.m_Files
.GetCount();i
++)
120 SLogCacheRevFileHeader header
;
121 header
.m_Magic
=LOG_DATA_FILE_MAGIC
;
122 header
.m_Version
=LOG_INDEX_VERSION
;
125 ar
<<header
.m_Version
;
126 ar
<<Rev
.m_Files
[i
].GetGitPathString();
127 ar
<<Rev
.m_Files
[i
].GetGitOldPathString();
128 ar
<<Rev
.m_Files
[i
].m_Action
;
129 ar
<<Rev
.m_Files
[i
].m_Stage
;
130 ar
<<Rev
.m_Files
[i
].m_StatAdd
;
131 ar
<<Rev
.m_Files
[i
].m_StatDel
;
137 int CLogCache::LoadOneItem(GitRev
&Rev
,ULONGLONG offset
)
139 SLogCacheRevItemHeader header
;
141 if(this->m_DataFile
.m_hFile
== CFile::hFileNull
)
143 BOOL b
=m_DataFile
.Open(m_GitDir
+_T("\\.git\\")+DATA_FILE_NAME
,
144 CFile::modeRead
|CFile::shareDenyNone
|
145 CFile::modeNoTruncate
|CFile::modeCreate
);
149 m_DataFile
.Seek(offset
,CFile::begin
);
151 UINT count
=m_DataFile
.Read(&header
,sizeof(SLogCacheRevItemHeader
));
152 if( count
!= sizeof(SLogCacheRevItemHeader
))
154 if( !CheckHeader(header
))
158 CArchive
ar(&m_DataFile
, CArchive::load
);
160 ar
>>Rev
.m_AuthorName
;
161 ar
>>Rev
.m_AuthorEmail
;
162 ar
>>Rev
.m_AuthorDate
;
163 ar
>>Rev
.m_CommitterName
;
164 ar
>>Rev
.m_CommitterEmail
;
165 ar
>>Rev
.m_CommitterDate
;
168 ar
>>Rev
.m_CommitHash
;
173 for(int i
=0;i
<header
.m_FileCount
;i
++)
176 CString file
,oldfile
;
178 SLogCacheRevFileHeader header
;
181 ar
>>header
.m_Version
;
183 if( this->CheckHeader(header
) )
187 path
.SetFromGit(file
,&oldfile
);
195 Rev
.m_Files
.AddPath(path
);
199 int CLogCache::RebuildCacheFile()
201 m_IndexFile
.SetLength(0);
202 m_DataFile
.SetLength(0);
204 SLogCacheIndexHeader header
;
205 header
.m_Magic
=LOG_INDEX_MAGIC
;
206 header
.m_Version
=LOG_INDEX_VERSION
;
207 m_IndexFile
.SeekToBegin();
208 m_IndexFile
.Write(&header
,sizeof(SLogCacheIndexHeader
));
212 SLogCacheRevFileHeader header
;
213 header
.m_Magic
=LOG_DATA_MAGIC
;
214 header
.m_Version
=LOG_INDEX_VERSION
;
216 m_DataFile
.SeekToBegin();
217 m_DataFile
.Write(&header
,sizeof(SLogCacheRevFileHeader
));
221 int CLogCache::SaveCache()
223 if( this->m_HashMap
.size() == 0 )
226 bool bIsRebuild
=false;
227 if(this->m_DataFile
.m_hFile
!= CFile::hFileNull
)
229 if(this->m_IndexFile
.m_hFile
!=CFile::hFileNull
)
232 if(this->m_IndexFile
.m_hFile
== CFile::hFileNull
)
234 BOOL b
=m_IndexFile
.Open(m_GitDir
+_T("\\.git\\")+INDEX_FILE_NAME
,
235 CFile::modeReadWrite
|CFile::shareDenyWrite
|
236 CFile::modeNoTruncate
|CFile::modeCreate
);
241 if(this->m_DataFile
.m_hFile
== CFile::hFileNull
)
243 BOOL b
=m_DataFile
.Open(m_GitDir
+_T("\\.git\\")+DATA_FILE_NAME
,
244 CFile::modeReadWrite
|CFile::shareDenyWrite
|
245 CFile::modeNoTruncate
|CFile::modeCreate
);
256 SLogCacheIndexHeader header
;
257 memset(&header
,0,sizeof(SLogCacheIndexHeader
));
258 UINT count
=m_IndexFile
.Read(&header
,sizeof(SLogCacheIndexHeader
));
259 if(count
!= sizeof(SLogCacheIndexHeader
) || !this->CheckHeader(header
))
268 SLogCacheRevFileHeader header
;
270 UINT count
=m_DataFile
.Read(&header
,sizeof(SLogCacheRevFileHeader
));
271 if( count
!= sizeof(SLogCacheRevFileHeader
) || !CheckHeader(header
))
279 m_DataFile
.SeekToEnd();
280 m_IndexFile
.SeekToEnd();
281 CGitHashMap::iterator i
;
282 for(i
=m_HashMap
.begin();i
!=m_HashMap
.end();i
++)
284 if(this->m_HashMapIndex
.find((*i
).second
.m_CommitHash
) == m_HashMapIndex
.end() || bIsRebuild
)
286 if((*i
).second
.m_IsFull
)
288 ULONGLONG offset
= m_DataFile
.GetPosition();
289 this->SaveOneItem((*i
).second
,offset
);
292 item
.m_Hash
= (*i
).second
.m_CommitHash
;
293 item
.m_Offset
=offset
;
295 m_IndexFile
.Write(&item
,sizeof(SLogCacheItem
));