Refactor rebase commit list: Don't fill list again and again when reordering commits
[TortoiseGit.git] / src / TortoiseProc / gitlogcache.h
bloba4cb0e2793dda5c7639c94b8d0b8990aab25e069
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2013, 2015-2017 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #pragma once
21 #include "GitRevLoglist.h"
22 #include "GitHash.h"
24 #define LOG_INDEX_MAGIC 0x88AA5566
25 #define LOG_DATA_MAGIC 0x99BB0FFF
26 #define LOG_DATA_ITEM_MAGIC 0x0FCC9ACC
27 #define LOG_DATA_FILE_MAGIC 0x19EE9DFF
28 #define LOG_INDEX_VERSION 0x11
30 #pragma pack (1)
31 struct SLogCacheIndexHeader
33 DWORD m_Magic;
34 DWORD m_Version;
35 DWORD m_ItemCount;
38 struct SLogCacheIndexItem
40 CGitHash m_Hash;
41 ULONGLONG m_Offset;
44 struct SLogCacheIndexFile
46 struct SLogCacheIndexHeader m_Header;
47 struct SLogCacheIndexItem m_Item[1]; //dynmatic size
50 struct SLogCacheRevFileHeader
52 DWORD m_Magic;
53 DWORD m_Action;
54 DWORD m_Stage;
55 DWORD m_ParentNo;
56 DWORD m_Add;
57 DWORD m_Del;
58 DWORD m_IsSubmodule;
59 DWORD m_FileNameSize;
60 DWORD m_OldFileNameSize;
61 TCHAR m_FileName[1];
64 struct SLogCacheRevItemHeader
66 DWORD m_Magic;
67 DWORD m_FileCount;
70 struct SLogCacheDataFileHeader
72 DWORD m_Magic;
73 DWORD m_Version;
75 # pragma pack ()
77 class CGitHashMap : public std::unordered_map<CGitHash, GitRevLoglist>
79 public:
80 bool IsExist(CGitHash &hash)
82 return find(hash) != end();
86 #define INDEX_FILE_NAME L"tortoisegit.index"
87 #define DATA_FILE_NAME L"tortoisegit.data"
89 class CLogCache
91 public:
93 protected:
94 BOOL m_bEnabled;
96 HANDLE m_IndexFile;
97 HANDLE m_IndexFileMap;
98 SLogCacheIndexFile *m_pCacheIndex;
102 HANDLE m_DataFile;
103 HANDLE m_DataFileMap;
104 BYTE *m_pCacheData;
105 DWORD m_DataFileLength;
107 void CloseDataHandles();
108 void CloseIndexHandles();
110 BOOL CheckHeader(SLogCacheIndexHeader *header)
112 if (header->m_Magic != LOG_INDEX_MAGIC)
113 return FALSE;
115 if (header->m_Version != LOG_INDEX_VERSION)
116 return FALSE;
118 return TRUE;
121 BOOL CheckHeader(SLogCacheRevFileHeader *header)
123 if (header->m_Magic != LOG_DATA_FILE_MAGIC)
124 return FALSE;
126 return TRUE;
129 BOOL CheckHeader(SLogCacheRevItemHeader *header)
131 if (header->m_Magic != LOG_DATA_ITEM_MAGIC)
132 return FALSE;
134 return TRUE;
137 BOOL CheckHeader(SLogCacheDataFileHeader *header)
139 if (header->m_Magic != LOG_DATA_MAGIC)
140 return FALSE;
142 if (header->m_Version != LOG_INDEX_VERSION)
143 return FALSE;
145 return TRUE;
148 int SaveOneItem(const GitRevLoglist& Rev, LONG offset);
150 CString m_GitDir;
151 int RebuildCacheFile();
153 public:
154 CLogCache();
155 ~CLogCache();
156 int FetchCacheIndex(CString GitDir);
157 int LoadOneItem(GitRevLoglist& Rev, ULONGLONG offset);
158 ULONGLONG GetOffset(const CGitHash& hash, SLogCacheIndexFile* pData = nullptr);
160 CGitHashMap m_HashMap;
162 GitRevLoglist* GetCacheData(const CGitHash& hash);
163 int SaveCache();
165 int ClearAllParent();
166 void ClearAllLanes();