Fix typos
[TortoiseGit.git] / test / UnitTests / GitIndexTest.cpp
blob7a2779f7fe4ee06d65d01e2546f726d030c6a47c
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2015-2020, 2023-2024 - 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.
20 #include "stdafx.h"
21 #include "RepositoryFixtures.h"
22 #include "gitindex.h"
23 #include "gitdll.h"
24 #include "PathUtils.h"
26 extern CGitAdminDirMap g_AdminDirMap; // not optimal yet
28 class GitIndexCBasicGitFixture : public CBasicGitFixture
30 protected:
31 virtual void SetUp()
33 CBasicGitFixture::SetUp();
34 g_AdminDirMap.clear();
38 class GitIndexCBasicGitWithTestRepoFixture : public CBasicGitWithTestRepoFixture
40 protected:
41 virtual void SetUp()
43 CBasicGitWithTestRepoFixture::SetUp();
44 g_AdminDirMap.clear();
48 class CBasicGitWithMultiLinkedTestWithSubmoduleRepoFixture : public CBasicGitWithTestRepoCreatorFixture
50 protected:
51 virtual void SetUp()
53 CBasicGitWithTestRepoCreatorFixture::SetUp();
55 // ====Main Work Tree Setup====
56 SetUpTestRepo(m_MainWorkTreePath);
58 m_Git.m_CurrentDir = m_MainWorkTreePath;
59 EXPECT_NE(0, SetCurrentDirectory(m_MainWorkTreePath));
61 CString output;
62 EXPECT_EQ(0, m_Git.Run(L"git.exe checkout -f master", &output, nullptr, CP_UTF8));
63 EXPECT_STRNE(L"", output);
65 if (CGit::ms_bCygwinGit || CGit::ms_bMsys2Git)
66 return;
68 // ====Source of the Sub-Module====
69 // Setup the repository in which the submodule will be fetched from
70 SetUpTestRepo(m_SubmoduleSource);
72 //====Sub-Module Inside of The Main Work Tree (Root Level)====
73 output.Empty();
74 EXPECT_EQ(0, m_Git.Run(L"git.exe submodule add \"" + m_SubmoduleSource + "\" sub1", &output, nullptr, CP_UTF8));
75 EXPECT_STREQ(L"", output);
77 output.Empty();
78 EXPECT_EQ(0, m_Git.Run(L"git.exe commit -a -m\"Add submodule for testing\"", &output, nullptr, CP_UTF8));
79 EXPECT_STRNE(L"", output);
81 // ====Linked Work Tree setup (Absolute Path)====
82 // Linked worktree using git worktree with an absolute path
83 output.Empty();
84 EXPECT_EQ(0, m_Git.Run(L"git.exe worktree add -b TestBranch \"" + m_LinkedWorkTreePath + "\"", &output, nullptr, CP_UTF8));
85 EXPECT_STRNE(L"", output);
88 CString m_MainWorkTreePath = m_Dir.GetTempDir() + L"\\MainWorkTree";
89 CString m_LinkedWorkTreePath = m_Dir.GetTempDir() + L"\\LinkedWorkTree";
90 CString m_SubmoduleSource = m_Dir.GetTempDir() + L"\\SubmoduleSource";
93 INSTANTIATE_TEST_SUITE_P(GitIndex, GitIndexCBasicGitFixture, testing::Values(LIBGIT2));
94 INSTANTIATE_TEST_SUITE_P(GitIndex, GitIndexCBasicGitWithTestRepoFixture, testing::Values(LIBGIT2));
95 INSTANTIATE_TEST_SUITE_P(GitIndex, CBasicGitWithMultiLinkedTestWithSubmoduleRepoFixture, testing::Values(LIBGIT2));
97 TEST_P(GitIndexCBasicGitFixture, EmptyDir)
99 CGitIndexList indexList;
100 EXPECT_EQ(-1, indexList.ReadIndex(m_Dir.GetTempDir()));
101 EXPECT_EQ(0U, indexList.size());
102 EXPECT_FALSE(indexList.m_bHasConflicts);
106 static void ReadAndCheckIndex(CGitIndexList& indexList, const CString& gitdir, unsigned int offset = 0)
108 EXPECT_EQ(0, indexList.ReadIndex(gitdir));
109 ASSERT_EQ(14 + offset, indexList.size());
111 EXPECT_STREQ(L"ansi.txt", indexList[offset].m_FileName);
112 EXPECT_EQ(static_cast<uint32_t>(102), indexList[offset].m_Size);
113 EXPECT_EQ(8, indexList[offset].m_Flags);
114 EXPECT_EQ(0, indexList[offset].m_FlagsExtended);
115 EXPECT_STREQ(L"961bdffbfce1bc617fb594091c3229f1cc674d76", indexList[offset].m_IndexHash.ToString());
116 EXPECT_STREQ(L"copy/ansi.txt", indexList[1 + offset].m_FileName);
117 EXPECT_EQ(static_cast<uint32_t>(103), indexList[1 + offset].m_Size);
118 EXPECT_EQ(13, indexList[1 + offset].m_Flags);
119 EXPECT_EQ(0, indexList[1 + offset].m_FlagsExtended);
120 EXPECT_STREQ(L"4c44667203f943dc5dbdf3cb526cb7ec24f60c09", indexList[1 + offset].m_IndexHash.ToString());
121 EXPECT_STREQ(L"copy/utf16-le-nobom.txt", indexList[5 + offset].m_FileName);
122 EXPECT_EQ(static_cast<uint32_t>(218), indexList[5 + offset].m_Size);
123 EXPECT_EQ(23, indexList[5 + offset].m_Flags);
124 EXPECT_EQ(0, indexList[5 + offset].m_FlagsExtended);
125 EXPECT_STREQ(L"fbea9ccd85c33fcdb542d8c73f910ea0e70c3ddc", indexList[5 + offset].m_IndexHash.ToString());
126 EXPECT_STREQ(L"utf8-nobom.txt", indexList[13 + offset].m_FileName);
127 EXPECT_EQ(static_cast<uint32_t>(139), indexList[13 + offset].m_Size);
128 EXPECT_EQ(14, indexList[13 + offset].m_Flags);
129 EXPECT_EQ(0, indexList[13 + offset].m_FlagsExtended);
130 EXPECT_STREQ(L"c225b3f14869ec8b6da32d52bd15dba0b043031d", indexList[13 + offset].m_IndexHash.ToString());
131 EXPECT_FALSE(indexList.m_bHasConflicts);
134 TEST_P(GitIndexCBasicGitWithTestRepoFixture, ReadIndex)
136 CString testFile = m_Dir.GetTempDir() + L"\\1.txt";
138 CGitIndexList indexList;
139 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
141 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(testFile, L"this is testing file."));
142 CString output;
143 EXPECT_EQ(0, m_Git.Run(L"git.exe add 1.txt", &output, CP_UTF8));
144 EXPECT_STREQ(L"", output);
148 CGitIndexList indexList;
149 ReadAndCheckIndex(indexList, m_Dir.GetTempDir(), 1);
151 EXPECT_STREQ(L"1.txt", indexList[0].m_FileName);
152 EXPECT_EQ(static_cast<uint32_t>(21), indexList[0].m_Size);
153 EXPECT_EQ(5, indexList[0].m_Flags);
154 EXPECT_EQ(0, indexList[0].m_FlagsExtended);
155 EXPECT_STREQ(L"e4aac1275dfc440ec521a76e9458476fe07038bb", indexList[0].m_IndexHash.ToString());
156 CString output;
157 EXPECT_EQ(0, m_Git.Run(L"git.exe rm -f 1.txt", &output, CP_UTF8));
161 CGitIndexList indexList;
162 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
164 CString output;
165 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(testFile, L"this is testing file."));
166 EXPECT_EQ(0, m_Git.Run(L"git.exe add -N 1.txt", &output, CP_UTF8));
167 EXPECT_STREQ(L"", output);
171 CGitIndexList indexList;
172 ReadAndCheckIndex(indexList, m_Dir.GetTempDir(), 1);
174 EXPECT_STREQ(L"1.txt", indexList[0].m_FileName);
175 EXPECT_EQ(static_cast<uint32_t>(0), indexList[0].m_Size);
176 EXPECT_EQ(16389, indexList[0].m_Flags);
177 EXPECT_EQ(GIT_INDEX_ENTRY_INTENT_TO_ADD, indexList[0].m_FlagsExtended);
178 EXPECT_STREQ(L"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", indexList[0].m_IndexHash.ToString());
182 TEST_P(GitIndexCBasicGitWithTestRepoFixture, GetFileStatus)
184 CGitIndexList indexList;
185 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
187 git_wc_status2_t status = { git_wc_status_none, false, false };
188 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"does-not-exist.txt", status, 10, 20, false));
189 EXPECT_EQ(git_wc_status_unversioned, status.status);
191 __int64 time = -1;
192 __int64 filesize = -1;
193 status = { git_wc_status_none, false, false };
194 EXPECT_EQ(-1, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
195 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", status, time, filesize, false));
196 EXPECT_EQ(git_wc_status_deleted, status.status);
197 filesize = 42; // some arbitrary size, i.e., file exists but is changed
198 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", status, time, filesize, false));
199 EXPECT_EQ(git_wc_status_modified, status.status);
201 CString output;
202 EXPECT_EQ(0, m_Git.Run(L"git.exe reset --hard", &output, CP_UTF8));
204 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
205 status = { git_wc_status_none, false, false };
206 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", status, time, filesize, false));
207 EXPECT_EQ(git_wc_status_normal, status.status);
208 EXPECT_FALSE(status.assumeValid);
209 EXPECT_FALSE(status.skipWorktree);
211 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), L"this is testing file."));
212 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
213 status = { git_wc_status_none, false, false };
214 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", status, time, filesize, false));
215 EXPECT_EQ(git_wc_status_modified, status.status);
216 EXPECT_FALSE(status.assumeValid);
217 EXPECT_FALSE(status.skipWorktree);
219 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this is testing file."));
220 EXPECT_EQ(0, m_Git.Run(L"git.exe add -- just-added.txt", &output, CP_UTF8));
222 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(CombinePath(m_Dir.GetTempDir(), L"noted-as-added.txt"), L"this is testing file."));
223 EXPECT_EQ(0, m_Git.Run(L"git.exe add -N -- noted-as-added.txt", &output, CP_UTF8));
225 CGitIndexList indexList2;
226 EXPECT_EQ(0, m_Git.Run(L"git.exe update-index --skip-worktree -- ansi.txt", &output, CP_UTF8));
227 EXPECT_EQ(0, indexList2.ReadIndex(m_Dir.GetTempDir()));
228 EXPECT_FALSE(indexList2.m_bHasConflicts);
229 status = { git_wc_status_none, false, false };
230 EXPECT_EQ(0, indexList2.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", status, time, filesize, false));
231 EXPECT_EQ(git_wc_status_normal, status.status);
232 EXPECT_FALSE(status.assumeValid);
233 EXPECT_TRUE(status.skipWorktree);
235 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
236 status = { git_wc_status_none, false, false };
237 EXPECT_EQ(0, indexList2.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", status, time, filesize, false));
238 EXPECT_EQ(git_wc_status_normal, status.status);
240 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"noted-as-added.txt"), &time, nullptr, &filesize));
241 status = { git_wc_status_none, false, false };
242 EXPECT_EQ(0, indexList2.GetFileStatus(m_Dir.GetTempDir(), L"noted-as-added.txt", status, time, filesize, false));
243 EXPECT_EQ(git_wc_status_added, status.status);
244 EXPECT_FALSE(status.assumeValid);
245 EXPECT_FALSE(status.skipWorktree);
247 EXPECT_EQ(0, m_Git.Run(L"git.exe update-index --no-skip-worktree ansi.txt", &output, CP_UTF8));
249 Sleep(1000);
250 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this IS testing file."));
251 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
252 status = { git_wc_status_none, false, false };
253 EXPECT_EQ(0, indexList2.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", status, time, filesize, false));
254 EXPECT_EQ(git_wc_status_modified, status.status);
256 output.Empty();
257 EXPECT_EQ(0, m_Git.Run(L"git.exe checkout --force forconflict", &output, CP_UTF8));
258 EXPECT_STRNE(L"", output);
260 output.Empty();
261 EXPECT_EQ(1, m_Git.Run(L"git.exe merge simple-conflict", &output, CP_UTF8));
262 EXPECT_STRNE(L"", output);
264 CGitIndexList indexList3;
265 EXPECT_EQ(0, indexList3.ReadIndex(m_Dir.GetTempDir()));
266 EXPECT_EQ(9U, indexList3.size());
267 EXPECT_TRUE(indexList3.m_bHasConflicts);
269 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
270 status = { git_wc_status_none, false, false };
271 EXPECT_EQ(0, indexList3.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", status, time, filesize, false));
272 EXPECT_EQ(git_wc_status_conflicted, status.status);
275 TEST(GitIndex, SearchInSortVector)
277 std::vector<CGitFileName> vector;
278 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 9, false));
279 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 0, false));
280 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", -1, false));
282 vector.push_back(CGitFileName(L"One", 0, 0));
283 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 9, false));
284 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", -1, false));
285 EXPECT_EQ(0U, SearchInSortVector(vector, L"something", 0, false)); // do we really need this behavior?
286 EXPECT_EQ(0U, SearchInSortVector(vector, L"One", 3, false));
287 EXPECT_EQ(0U, SearchInSortVector(vector, L"One", -1, false));
288 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"One/", 4, false));
289 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"one", 3, false));
290 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"one", -1, false));
291 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"one/", 4, false));
293 vector.push_back(CGitFileName(L"tWo", 0, 0));
294 DoSortFilenametSortVector(vector, false);
295 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 9, false));
296 EXPECT_EQ(0U, SearchInSortVector(vector, L"One", 3, false));
297 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"one", 3, false));
298 EXPECT_EQ(1U, SearchInSortVector(vector, L"tWo", 3, false));
299 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"two", 3, false));
300 EXPECT_EQ(1U, SearchInSortVector(vector, L"t", 1, false));
301 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"0", 1, false));
302 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"z", 1, false));
304 vector.push_back(CGitFileName(L"b/1", 0, 0));
305 vector.push_back(CGitFileName(L"b/2", 0, 0));
306 vector.push_back(CGitFileName(L"a", 0, 0));
307 vector.push_back(CGitFileName(L"b/3", 0, 0));
308 vector.push_back(CGitFileName(L"b/4", 0, 0));
309 vector.push_back(CGitFileName(L"b/5", 0, 0));
310 DoSortFilenametSortVector(vector, false);
311 EXPECT_EQ(0U, SearchInSortVector(vector, L"One", 3, false));
312 EXPECT_EQ(3U, SearchInSortVector(vector, L"b/2", 3, false));
313 EXPECT_EQ(3U, SearchInSortVector(vector, L"b/2", -1, false));
314 EXPECT_LT(2U, SearchInSortVector(vector, L"b/", 2, false));
315 EXPECT_GE(6U, SearchInSortVector(vector, L"b/", 2, false));
316 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"b/6", 3, false));
317 EXPECT_EQ(1U, SearchInSortVector(vector, L"a", 1, false));
318 EXPECT_EQ(7U, SearchInSortVector(vector, L"tWo", 3, false));
321 TEST(GitIndex, SearchInSortVector_IgnoreCase)
323 std::vector<CGitFileName> vector;
324 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 9, true));
325 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 0, true));
326 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", -1, true));
328 vector.push_back(CGitFileName(L"One", 0, 0));
329 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 9, true));
330 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", -1, true));
331 EXPECT_EQ(0U, SearchInSortVector(vector, L"something", 0, true)); // do we really need this behavior?
332 EXPECT_EQ(0U, SearchInSortVector(vector, L"One", 3, true));
333 EXPECT_EQ(0U, SearchInSortVector(vector, L"One", -1, true));
334 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"One/", 4, true));
335 EXPECT_EQ(0U, SearchInSortVector(vector, L"one", 3, true));
336 EXPECT_EQ(0U, SearchInSortVector(vector, L"one", -1, true));
337 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"one/", 4, true));
339 vector.push_back(CGitFileName(L"tWo", 0, 0));
340 DoSortFilenametSortVector(vector, true);
341 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"something", 9, true));
342 EXPECT_EQ(0U, SearchInSortVector(vector, L"One", 3, true));
343 EXPECT_EQ(0U, SearchInSortVector(vector, L"one", 3, true));
344 EXPECT_EQ(1U, SearchInSortVector(vector, L"tWo", 3, true));
345 EXPECT_EQ(1U, SearchInSortVector(vector, L"two", 3, true));
346 EXPECT_EQ(1U, SearchInSortVector(vector, L"t", 1, true));
347 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"0", 1, true));
348 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"z", 1, true));
350 vector.push_back(CGitFileName(L"b/1", 0, 0));
351 vector.push_back(CGitFileName(L"b/2", 0, 0));
352 vector.push_back(CGitFileName(L"a", 0, 0));
353 vector.push_back(CGitFileName(L"b/3", 0, 0));
354 vector.push_back(CGitFileName(L"b/4", 0, 0));
355 vector.push_back(CGitFileName(L"b/5", 0, 0));
356 DoSortFilenametSortVector(vector, true);
357 EXPECT_EQ(0U, SearchInSortVector(vector, L"a", 1, true));
358 EXPECT_EQ(2U, SearchInSortVector(vector, L"b/2", 3, true));
359 EXPECT_EQ(2U, SearchInSortVector(vector, L"b/2", -1, true));
360 EXPECT_LT(1U, SearchInSortVector(vector, L"b/", 2, true));
361 EXPECT_GE(5U, SearchInSortVector(vector, L"b/", 2, true));
362 EXPECT_EQ(NPOS, SearchInSortVector(vector, L"b/6", 3, true));
363 EXPECT_EQ(6U, SearchInSortVector(vector, L"One", 3, true));
364 EXPECT_EQ(7U, SearchInSortVector(vector, L"tWo", 3, true));
367 static void CheckRangeInSortVector(bool ignoreCase)
369 std::vector<CGitFileName> vector;
371 size_t start = NPOS;
372 size_t end = NPOS;
373 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, &start, &end, NPOS));
374 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, &start, &end, 0));
375 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, &start, nullptr, 0));
376 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, nullptr, &end, 0));
377 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, nullptr, &end, 1));
378 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"", 0, ignoreCase, &start, &end, 0));
379 EXPECT_EQ(NPOS, start);
380 EXPECT_EQ(NPOS, end);
382 vector.push_back(CGitFileName(L"a", 0, 0));
383 start = end = NPOS;
384 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, &start, &end, NPOS));
385 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, &start, nullptr, 0));
386 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, nullptr, &end, 0));
387 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, ignoreCase, nullptr, &end, 1));
389 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, ignoreCase, &start, &end, NPOS));
390 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, ignoreCase, &start, nullptr, 0));
391 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, ignoreCase, nullptr, &end, 0));
392 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, ignoreCase, nullptr, &end, 1));
393 start = end = NPOS;
394 EXPECT_EQ(0, GetRangeInSortVector(vector, L"", 0, ignoreCase, &start, &end, 0));
395 EXPECT_EQ(0U, start);
396 EXPECT_EQ(0U, end);
397 start = end = NPOS;
398 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"", 0, ignoreCase, &start, &end, 1));
400 start = end = NPOS;
401 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"0", 1, ignoreCase, &start, &end, 0));
402 EXPECT_EQ(NPOS, start);
403 EXPECT_EQ(NPOS, end);
404 start = end = NPOS;
405 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b", 1, ignoreCase, &start, &end, 0));
406 EXPECT_EQ(NPOS, start);
407 EXPECT_EQ(NPOS, end);
409 start = end = NPOS;
410 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, ignoreCase, &start, &end, 0));
411 EXPECT_EQ(0U, start);
412 EXPECT_EQ(0U, end);
414 vector.push_back(CGitFileName(L"b/1", 0, 0));
415 vector.push_back(CGitFileName(L"b/2", 0, 0));
416 vector.push_back(CGitFileName(L"b/3", 0, 0));
417 vector.push_back(CGitFileName(L"b/4", 0, 0));
418 vector.push_back(CGitFileName(L"b/5", 0, 0));
420 start = end = NPOS;
421 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, ignoreCase, &start, &end, 0));
422 EXPECT_EQ(0U, start);
423 EXPECT_EQ(0U, end);
425 start = end = NPOS;
426 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 1));
427 EXPECT_EQ(1U, start);
428 EXPECT_EQ(5U, end);
430 start = end = NPOS;
431 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 2));
432 EXPECT_EQ(1U, start);
433 EXPECT_EQ(5U, end);
435 start = end = NPOS;
436 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 4));
437 EXPECT_EQ(1U, start);
438 EXPECT_EQ(5U, end);
440 start = end = NPOS;
441 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 5));
442 EXPECT_EQ(1U, start);
443 EXPECT_EQ(5U, end);
445 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 6)); // 6 is >= vector.size()
447 start = end = NPOS;
448 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, ignoreCase, &start, &end, 0));
449 EXPECT_EQ(NPOS, start);
450 EXPECT_EQ(NPOS, end);
452 start = end = NPOS;
453 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, ignoreCase, &start, &end, 5));
454 EXPECT_EQ(NPOS, start);
455 EXPECT_EQ(NPOS, end);
457 vector.push_back(CGitFileName(L"c", 0, 0));
458 vector.push_back(CGitFileName(L"d", 0, 0));
460 start = end = NPOS;
461 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 1));
462 EXPECT_EQ(1U, start);
463 EXPECT_EQ(5U, end);
465 start = end = NPOS;
466 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 2));
467 EXPECT_EQ(1U, start);
468 EXPECT_EQ(5U, end);
470 start = end = NPOS;
471 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 4));
472 EXPECT_EQ(1U, start);
473 EXPECT_EQ(5U, end);
475 start = end = NPOS;
476 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, ignoreCase, &start, &end, 5));
477 EXPECT_EQ(1U, start);
478 EXPECT_EQ(5U, end);
480 start = end = NPOS;
481 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, ignoreCase, &start, &end, 6));
482 EXPECT_EQ(NPOS, start);
483 EXPECT_EQ(NPOS, end);
485 start = end = NPOS;
486 EXPECT_EQ(0, GetRangeInSortVector(vector, L"c", 1, ignoreCase, &start, &end, 6));
487 EXPECT_EQ(6U, start);
488 EXPECT_EQ(6U, end);
490 start = end = NPOS;
491 EXPECT_EQ(0, GetRangeInSortVector(vector, L"", 0, ignoreCase, &start, &end, 0));
492 EXPECT_EQ(0U, start);
493 EXPECT_EQ(7U, end);
496 TEST(GitIndex, GetRangeInSortVector)
498 CheckRangeInSortVector(false);
499 CheckRangeInSortVector(true);
502 TEST(GitIndex, CGitIgnoreItem)
504 CAutoTempDir tempDir;
505 CGitIgnoreItem ignoreItem;
507 int ignoreCase = 0;
508 int type = DT_DIR;
509 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
510 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
511 type = DT_REG;
512 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
513 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
515 EXPECT_EQ(-1, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), L"does-not-exist", false, &ignoreCase));
516 EXPECT_EQ(-1, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), L"does-not-exist", true, &ignoreCase));
518 CString ignoreFile = tempDir.GetTempDir() + L"\\.gitignore";
520 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L""));
521 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
522 EXPECT_STREQ("", ignoreItem.m_BaseDir);
523 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
524 EXPECT_STREQ("", ignoreItem.m_BaseDir);
526 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"#"));
527 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
528 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
530 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"# comment"));
531 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
532 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
534 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"\n"));
535 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
536 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
538 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"\n#"));
539 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
540 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
542 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"*.tmp\n"));
543 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
544 type = DT_DIR;
545 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
546 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
547 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
548 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
549 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tMp", type));
550 ignoreCase = 1;
551 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
552 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
553 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
554 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
555 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
556 type = DT_REG;
557 ignoreCase = 0;
558 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
559 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
560 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
561 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
562 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tMp", type));
563 ignoreCase = 1;
564 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
565 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
566 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
567 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
568 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
569 ignoreCase = 0;
570 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
571 type = DT_DIR;
572 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
573 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
574 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
575 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
576 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tMp", type));
577 type = DT_REG;
578 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
579 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
580 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
581 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
582 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tMp", type));
584 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"*.tMp\n"));
585 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
586 type = DT_DIR;
587 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
588 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
589 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tMp", type));
590 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tMp.1", type));
591 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tmp", type));
592 ignoreCase = 1;
593 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
594 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
595 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tMp", type));
596 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
597 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
598 type = DT_REG;
599 ignoreCase = 0;
600 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
601 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
602 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tMp", type));
603 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tMp.1", type));
604 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tmp", type));
605 ignoreCase = 1;
606 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
607 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
608 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tMp", type));
609 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tMp.1", type));
610 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
611 ignoreCase = 0;
612 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
613 type = DT_DIR;
614 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
615 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
616 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tMp", type));
617 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tMp.1", type));
618 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tmp", type));
619 type = DT_REG;
620 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
621 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tMp", type));
622 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tMp", type));
623 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tMp.1", type));
624 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("text.tmp", type));
626 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"some-file\n"));
627 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
628 type = DT_DIR;
629 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
630 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
631 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
632 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
633 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
634 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-File", type));
635 ignoreCase = 1;
636 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
637 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
638 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
639 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
640 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
641 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
642 type = DT_REG;
643 ignoreCase = 0;
644 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
645 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
646 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
647 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
648 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
649 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-File", type));
650 ignoreCase = 1;
651 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
652 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
653 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
654 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
655 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
656 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
657 ignoreCase = 0;
658 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
659 type = DT_DIR;
660 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
661 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
662 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
663 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
664 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
665 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-File", type));
666 ignoreCase = 1;
667 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
668 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
669 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
670 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
671 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
672 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
673 ignoreCase = 0;
674 type = DT_REG;
675 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
676 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
677 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
678 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
679 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
680 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-File", type));
681 ignoreCase = 1;
682 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
683 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
684 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
685 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
686 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-file", type));
687 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
689 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"some-File\n"));
690 ignoreCase = 0;
691 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
692 type = DT_DIR;
693 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
694 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
695 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-File", type));
696 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
697 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-File", type));
698 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
699 ignoreCase = 1;
700 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
701 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
702 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
703 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
704 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-File", type));
705 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
706 type = DT_REG;
707 ignoreCase = 0;
708 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
709 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
710 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-File", type));
711 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
712 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-File", type));
713 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
714 ignoreCase = 1;
715 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
716 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
717 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-File", type));
718 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-File", type));
719 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subDir/some-File", type));
720 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
722 ignoreCase = 1;
723 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"\n\nsome-file\n"));
724 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
725 type = DT_DIR;
726 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
727 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
728 type = DT_REG;
729 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
730 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
731 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
732 type = DT_DIR;
733 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
734 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
735 type = DT_REG;
736 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
737 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
739 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"/some-file"));
740 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
741 type = DT_DIR;
742 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
743 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
744 type = DT_REG;
745 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
746 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
747 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
748 type = DT_DIR;
749 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
750 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
751 type = DT_REG;
752 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
753 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
755 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"some-dir/"));
756 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
757 type = DT_DIR;
758 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
759 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
760 type = DT_REG;
761 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-file", type));
762 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
763 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
764 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
765 type = DT_DIR;
766 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
767 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
768 type = DT_REG;
769 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-file", type));
770 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
771 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
773 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"some-*\n!some-file"));
774 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
775 type = DT_DIR;
776 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
777 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
778 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
779 type = DT_REG;
780 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
781 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
782 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
783 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
784 type = DT_DIR;
785 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
786 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
787 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
788 type = DT_REG;
789 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
790 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
791 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
793 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"some-file\nanother/dir/*"));
794 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
795 type = DT_DIR;
796 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
797 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
798 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
799 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
800 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
801 type = DT_REG;
802 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
803 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
804 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
805 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
806 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
807 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
808 type = DT_DIR;
809 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
810 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
811 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
812 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
813 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
814 type = DT_REG;
815 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
816 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
817 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
818 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
819 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
821 EXPECT_TRUE(::CreateDirectory(tempDir.GetTempDir() + L"\\subdir", nullptr));
822 ignoreFile = tempDir.GetTempDir() + L"\\subdir\\.gitignore";
823 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"/something"));
824 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
825 EXPECT_STREQ("subdir/", ignoreItem.m_BaseDir);
826 type = DT_DIR;
827 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
828 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
829 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
830 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
831 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
832 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
833 type = DT_REG;
834 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
835 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
836 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
837 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
838 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
839 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
840 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
841 EXPECT_STREQ("", ignoreItem.m_BaseDir);
842 type = DT_DIR;
843 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
844 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
845 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
846 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something", type));
847 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
848 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
849 type = DT_REG;
850 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
851 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
852 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
853 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something", type));
854 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
855 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
857 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(ignoreFile, L"something"));
858 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false, &ignoreCase));
859 EXPECT_STREQ("subdir/", ignoreItem.m_BaseDir);
860 type = DT_DIR;
861 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
862 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
863 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
864 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
865 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
866 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
867 type = DT_REG;
868 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
869 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
870 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
871 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
872 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
873 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
874 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true, &ignoreCase));
875 EXPECT_STREQ("", ignoreItem.m_BaseDir);
876 type = DT_DIR;
877 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
878 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
879 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
880 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
881 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
882 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
883 type = DT_REG;
884 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
885 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
886 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
887 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
888 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
889 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
892 TEST_P(CBasicGitWithMultiLinkedTestWithSubmoduleRepoFixture, AdminDirMap) // Submodule & Test
894 CString adminDir;
895 CString workDir;
897 // Test if the main work tree admin directory can be found
898 adminDir = g_AdminDirMap.GetAdminDir(m_MainWorkTreePath);
899 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git", adminDir));
901 // Test test main work tree reverse lookup
902 workDir = g_AdminDirMap.GetWorkingCopy(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git");
903 EXPECT_TRUE(CPathUtils::IsSamePath(m_MainWorkTreePath, workDir));
905 if (CGit::ms_bCygwinGit || CGit::ms_bMsys2Git)
906 return;
908 // Test if the linked repository admin directory can be found (**WITHOUT** trailing path delimiter)
909 adminDir = g_AdminDirMap.GetAdminDir(m_LinkedWorkTreePath);
910 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git", adminDir));
912 // Test if the linked worktree admin directory can be found (**WITH** trailing path delimiter)
913 adminDir = g_AdminDirMap.GetWorktreeAdminDir(CPathUtils::BuildPathWithPathDelimiter(m_LinkedWorkTreePath));
914 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\worktrees\\LinkedWorkTree", adminDir));
916 // Test if the linked worktree admin directory can be found (**WITHOUT** trailing path delimiter)
917 adminDir = g_AdminDirMap.GetWorktreeAdminDir(m_LinkedWorkTreePath);
918 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\worktrees\\LinkedWorkTree", adminDir));
920 // Test reverse lookup on linked worktree admin directory (**WITH** trailing path delimiter)
921 workDir = g_AdminDirMap.GetWorkingCopy(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\worktrees\\LinkedWorkTree\\");
922 EXPECT_TRUE(CPathUtils::IsSamePath(m_LinkedWorkTreePath, workDir));
924 // Test reverse lookup on linked worktree admin directory (**WITHOUT** trailing path delimiter)
925 workDir = g_AdminDirMap.GetWorkingCopy(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\worktrees\\LinkedWorkTree");
926 EXPECT_TRUE(CPathUtils::IsSamePath(m_LinkedWorkTreePath, workDir));
928 // Test if the sub-module admin directory can be found (**WITH** trailing path delimiter)
929 adminDir = g_AdminDirMap.GetAdminDir(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L"sub1\\");
930 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\modules\\sub1", adminDir));
932 // Test if the sub-module admin directory can be found (**WITHOUT** trailing path delimiter)
933 adminDir = g_AdminDirMap.GetAdminDir(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L"sub1");
934 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\modules\\sub1", adminDir));
936 // Test if reverse lookup on submodule works (**WITH** trailing path delimiter)
937 workDir = g_AdminDirMap.GetWorkingCopy(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\modules\\sub1\\");
938 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L"sub1", workDir));
940 // Test if reverse lookup on submodule works (**WITHOUT** trailing path delimiter)
941 workDir = g_AdminDirMap.GetWorkingCopy(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L".git\\modules\\sub1");
942 EXPECT_TRUE(CPathUtils::IsSamePath(CPathUtils::BuildPathWithPathDelimiter(m_MainWorkTreePath) + L"sub1", workDir));