OSDN Git Service

36eff941b325574086f568bc86a0ef780cff7f7c
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogCache.cpp
1 #include "stdafx.h"\r
2 #include "GitLogCache.h"\r
3 \r
4 CLogCache::CLogCache()\r
5 {\r
6 \r
7 }\r
8 \r
9 CLogCache::~CLogCache()\r
10 {\r
11         this->m_IndexFile.Close();\r
12         this->m_DataFile.Close();\r
13 }\r
14 \r
15 int CLogCache::FetchCache(CString GitDir)\r
16 {\r
17         if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
18         {\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
22                 if(!b)\r
23                         return -1;\r
24         }\r
25 \r
26         SLogCacheIndexHeader header;\r
27         UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));\r
28         if(count != sizeof(SLogCacheIndexHeader))\r
29                 return -2;\r
30 \r
31         if( header.m_Magic != LOG_INDEX_MAGIC )\r
32                 return -3;\r
33 \r
34         if( header.m_Version != LOG_INDEX_VERSION )\r
35                 return -4;\r
36 \r
37 \r
38         SLogCacheItem Item;\r
39 \r
40         for(int i=0;i<header.m_ItemCount;i++)\r
41         {\r
42                 count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem));    \r
43                 if( count != sizeof(SLogCacheItem) )\r
44                         break;\r
45 \r
46                 CString str;\r
47                 g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);\r
48                 this->m_HashMapIndex[str]=Item.m_Offset;\r
49         }\r
50 \r
51         return 0;\r
52 }\r
53 \r
54 int CLogCache::SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
55 {\r
56         \r
57         SLogCacheRevItemHeader header;\r
58         m_DataFile.Seek(offset,CFile::begin);\r
59 \r
60         if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
61         {\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
65                 if(!b)\r
66                         return -1;\r
67         }\r
68 \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
72 \r
73         m_DataFile.Write(&header,sizeof(SLogCacheRevItemHeader));\r
74         \r
75         CArchive ar(&m_DataFile, CArchive::store);\r
76 \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
83         ar<<Rev.m_Subject;\r
84         ar<<Rev.m_Body;\r
85         ar<<Rev.m_CommitHash;\r
86         ar<<Rev.m_Action;\r
87 \r
88         for(int i=0;i<Rev.m_Files.GetCount();i++)\r
89         {\r
90                 SLogCacheRevFileHeader header;\r
91                 header.m_Magic=LOG_DATA_FILE_MAGIC;\r
92                 header.m_Version=LOG_INDEX_VERSION;\r
93 \r
94                 ar<<header.m_Magic;\r
95                 ar<<header.m_Version;\r
96 \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
102         }\r
103         return 0;\r
104 }\r
105 \r
106 int CLogCache::LoadOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
107 {\r
108         SLogCacheRevItemHeader header;\r
109         m_DataFile.Seek(offset,CFile::begin);\r
110 \r
111         if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
112         {\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
116                 if(!b)\r
117                         return -1;\r
118         }\r
119 \r
120         UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevItemHeader));\r
121         if( count != sizeof(SLogCacheRevItemHeader))\r
122                 return -1;\r
123         if( !CheckHeader(header))\r
124                 return -2;\r
125 \r
126 \r
127         CArchive ar(&m_DataFile, CArchive::load);\r
128 \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
135         ar>>Rev.m_Subject;\r
136         ar>>Rev.m_Body;\r
137         ar>>Rev.m_CommitHash;\r
138         ar>>Rev.m_Action;\r
139 \r
140         Rev.m_Files.Clear();\r
141 \r
142         for(int i=0;i<header.m_FileCount;i++)\r
143         {\r
144                 CTGitPath path;\r
145                 CString file;\r
146                 path.Reset();\r
147                 SLogCacheRevFileHeader header;\r
148 \r
149                 ar>>header.m_Magic;\r
150                 ar>>header.m_Version;\r
151 \r
152                 if( this->CheckHeader(header) )\r
153                         return -1;\r
154 \r
155                 ar>>path.m_Action;\r
156                 ar>>path.m_Stage;\r
157                 ar>>path.m_StatAdd;\r
158                 ar>>path.m_StatDel;\r
159                 ar>>file;\r
160                 path.SetFromGit(file);\r
161                 Rev.m_Files.AddPath(path);\r
162         }\r
163         return 0;\r
164 }