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
15 int CLogCache::FetchCache(CString GitDir)
\r
17 if(this->m_IndexFile.m_hFile == CFile::hFileNull)
\r
19 BOOL b=m_IndexFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
\r
20 CFile::modeRead|CFile::shareDenyNone|
\r
21 CFile::modeNoTruncate|CFile::modeCreate);
\r
26 SLogCacheIndexHeader header;
\r
27 UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));
\r
28 if(count != sizeof(SLogCacheIndexHeader))
\r
31 if( header.m_Magic != LOG_INDEX_MAGIC )
\r
34 if( header.m_Version != LOG_INDEX_VERSION )
\r
40 for(int i=0;i<header.m_ItemCount;i++)
\r
42 count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem));
\r
43 if( count != sizeof(SLogCacheItem) )
\r
47 g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);
\r
48 this->m_HashMapIndex[str]=Item.m_Offset;
\r
54 int CLogCache::SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset)
\r
57 SLogCacheRevItemHeader header;
\r
58 m_DataFile.Seek(offset,CFile::begin);
\r
60 if(this->m_DataFile.m_hFile == CFile::hFileNull)
\r
62 BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
\r
63 CFile::modeRead|CFile::shareDenyNone|
\r
64 CFile::modeNoTruncate|CFile::modeCreate);
\r
69 header.m_Magic=LOG_DATA_ITEM_MAGIC;
\r
70 header.m_Version=LOG_INDEX_VERSION;
\r
71 header.m_FileCount=Rev.m_Files.GetCount();
\r
73 m_DataFile.Write(&header,sizeof(SLogCacheRevItemHeader));
\r
75 CArchive ar(&m_DataFile, CArchive::store);
\r
77 ar<<Rev.m_AuthorName;
\r
78 ar<<Rev.m_AuthorEmail;
\r
79 ar<<Rev.m_AuthorDate;
\r
80 ar<<Rev.m_CommitterName;
\r
81 ar<<Rev.m_CommitterEmail;
\r
82 ar<<Rev.m_CommitterDate;
\r
85 ar<<Rev.m_CommitHash;
\r
88 for(int i=0;i<Rev.m_Files.GetCount();i++)
\r
90 SLogCacheRevFileHeader header;
\r
91 header.m_Magic=LOG_DATA_FILE_MAGIC;
\r
92 header.m_Version=LOG_INDEX_VERSION;
\r
95 ar<<header.m_Version;
\r
97 ar<<Rev.m_Files[i].m_Action;
\r
98 ar<<Rev.m_Files[i].m_Stage;
\r
99 ar<<Rev.m_Files[i].m_StatAdd;
\r
100 ar<<Rev.m_Files[i].m_StatDel;
\r
101 ar<<Rev.m_Files[i].GetGitPathString();
\r
106 int CLogCache::LoadOneItem(CString &GitDir,GitRev &Rev,UINT offset)
\r
108 SLogCacheRevItemHeader header;
\r
109 m_DataFile.Seek(offset,CFile::begin);
\r
111 if(this->m_DataFile.m_hFile == CFile::hFileNull)
\r
113 BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,
\r
114 CFile::modeRead|CFile::shareDenyNone|
\r
115 CFile::modeNoTruncate|CFile::modeCreate);
\r
120 UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevItemHeader));
\r
121 if( count != sizeof(SLogCacheRevItemHeader))
\r
123 if( !CheckHeader(header))
\r
127 CArchive ar(&m_DataFile, CArchive::load);
\r
129 ar>>Rev.m_AuthorName;
\r
130 ar>>Rev.m_AuthorEmail;
\r
131 ar>>Rev.m_AuthorDate;
\r
132 ar>>Rev.m_CommitterName;
\r
133 ar>>Rev.m_CommitterEmail;
\r
134 ar>>Rev.m_CommitterDate;
\r
137 ar>>Rev.m_CommitHash;
\r
140 Rev.m_Files.Clear();
\r
142 for(int i=0;i<header.m_FileCount;i++)
\r
147 SLogCacheRevFileHeader header;
\r
149 ar>>header.m_Magic;
\r
150 ar>>header.m_Version;
\r
152 if( this->CheckHeader(header) )
\r
157 ar>>path.m_StatAdd;
\r
158 ar>>path.m_StatDel;
\r
160 path.SetFromGit(file);
\r
161 Rev.m_Files.AddPath(path);
\r