1
// TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2003-2007 - TortoiseSVN
4 // Copyright (C) 2008-2017 - TortoiseGit
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include "GitLogCache.h"
25 #include <unordered_map>
26 #include <unordered_set>
30 * \ingroup TortoiseProc
31 * Instances of CStoreSelection save the selection of the CLogDlg. When the instance
32 * is deleted the destructor restores the selection.
34 typedef std::unordered_map
<CGitHash
, int> MAP_HASH_REV
;
37 * \ingroup TortoiseProc
38 * Helper class for the log dialog, handles all the log entries, including
41 class CLogDataVector
: public std::vector
<CGitHash
>
44 CLogCache
*m_pLogCache
;
45 /// De-allocates log items.
46 CLogDataVector(CLogCache
*pLogCache
)
48 m_pLogCache
=pLogCache
;
50 // Default to value set in Registry
51 m_logOrderBy
= CRegDWORD(L
"Software\\TortoiseGit\\LogOrderBy", CGit::LOG_ORDER_TOPOORDER
);
55 m_pLogCache
= nullptr;
57 // Default to value set in Registry
58 m_logOrderBy
= CRegDWORD(L
"Software\\TortoiseGit\\LogOrderBy", CGit::LOG_ORDER_TOPOORDER
);
60 void SetLogCache(CLogCache
*pLogCache
)
62 m_pLogCache
= pLogCache
;
64 GitRevLoglist
& GetGitRevAt(size_t i
)
67 return m_pLogCache
->m_HashMap
[(*this)[i
]];
70 int ParserFromLog(CTGitPath
* path
= nullptr, DWORD count
= 0, DWORD infomask
= CGit::LOG_INFO_STAT
| CGit::LOG_INFO_FILESTATE
| CGit::LOG_INFO_SHOW_MERGEDFILE
, CString
* range
= nullptr);
71 int Fill(std::unordered_set
<CGitHash
>& hashes
);
75 // Log order: LOG_ORDER_CHRONOLOGIALREVERSED, LOG_ORDER_TOPOORDER, LOG_ORDER_DATEORDER
77 MAP_HASH_REV m_HashMap
;
78 void updateLanes(GitRevLoglist
& c
, Lanes
& lns
, CGitHash
& sha
);
79 void setLane(CGitHash
& sha
) ;
80 void append(CGitHash
& sha
, bool storeInVector
);
83 /// Ascending date sorting.
86 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
88 return pStart
->tmDate
< pEnd
->tmDate
;
91 /// Descending date sorting.
94 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
96 return pStart
->tmDate
> pEnd
->tmDate
;
99 /// Ascending revision sorting.
102 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
104 return pStart
->Rev
< pEnd
->Rev
;
107 /// Descending revision sorting.
110 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
112 return pStart
->Rev
> pEnd
->Rev
;
115 /// Ascending author sorting.
118 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
120 int ret
= pStart
->sAuthor
.CompareNoCase(pEnd
->sAuthor
);
122 return pStart
->Rev
< pEnd
->Rev
;
126 /// Descending author sorting.
127 struct DescAuthorSort
129 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
131 int ret
= pStart
->sAuthor
.CompareNoCase(pEnd
->sAuthor
);
133 return pStart
->Rev
> pEnd
->Rev
;
137 /// Ascending bugID sorting.
140 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
142 int ret
= pStart
->sBugIDs
.CompareNoCase(pEnd
->sBugIDs
);
144 return pStart
->Rev
< pEnd
->Rev
;
148 /// Descending bugID sorting.
151 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
153 int ret
= pStart
->sBugIDs
.CompareNoCase(pEnd
->sBugIDs
);
155 return pStart
->Rev
> pEnd
->Rev
;
159 /// Ascending message sorting.
160 struct AscMessageSort
162 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
164 return pStart
->sShortMessage
.CompareNoCase(pEnd
->sShortMessage
)<0;
167 /// Descending message sorting.
168 struct DescMessageSort
170 bool operator()(GitRev
& pStart
, GitRev
& pEnd
)
172 return pStart
->sShortMessage
.CompareNoCase(pEnd
->sShortMessage
)>0;
175 /// Ascending action sorting
178 bool operator() (GitRev
& pStart
, GitRev
& pEnd
)
180 if (pStart
->actions
== pEnd
->actions
)
181 return pStart
->Rev
< pEnd
->Rev
;
182 return pStart
->actions
< pEnd
->actions
;
185 /// Descending action sorting
186 struct DescActionSort
188 bool operator() (GitRev
& pStart
, GitRev
& pEnd
)
190 if (pStart
->actions
== pEnd
->actions
)
191 return pStart
->Rev
> pEnd
->Rev
;
192 return pStart
->actions
> pEnd
->actions
;