Performance optimization: Do not search whole vector if we know we need all
[TortoiseGit.git] / test / UnitTests / GitIndexTest.cpp
blobc555af534486f5c9aa8a8a5fa448cc532b2f4dde
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2015 - 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"
25 extern CGitAdminDirMap g_AdminDirMap; // not optimal yet
27 class GitIndexCBasicGitFixture : public CBasicGitFixture
29 protected:
30 virtual void SetUp()
32 CBasicGitFixture::SetUp();
33 g_AdminDirMap.clear();
37 class GitIndexCBasicGitWithEmptyRepositoryFixture : public CBasicGitWithEmptyRepositoryFixture
39 protected:
40 virtual void SetUp()
42 CBasicGitWithEmptyRepositoryFixture::SetUp();
43 g_AdminDirMap.clear();
47 class GitIndexCBasicGitWithTestRepoFixture : public CBasicGitWithTestRepoFixture
49 protected:
50 virtual void SetUp()
52 CBasicGitWithTestRepoFixture::SetUp();
53 g_AdminDirMap.clear();
57 INSTANTIATE_TEST_CASE_P(GitIndex, GitIndexCBasicGitFixture, testing::Values(LIBGIT2));
58 INSTANTIATE_TEST_CASE_P(GitIndex, GitIndexCBasicGitWithEmptyRepositoryFixture, testing::Values(LIBGIT2));
59 INSTANTIATE_TEST_CASE_P(GitIndex, GitIndexCBasicGitWithTestRepoFixture, testing::Values(LIBGIT2));
61 TEST_P(GitIndexCBasicGitFixture, EmptyDir)
63 CGitIndexList indexList;
64 EXPECT_EQ(-1, indexList.ReadIndex(m_Dir.GetTempDir()));
65 EXPECT_EQ(0, indexList.size());
69 static void ReadAndCheckIndex(CGitIndexList& indexList, const CString& gitdir, int offset = 0)
71 EXPECT_EQ(0, indexList.ReadIndex(gitdir));
72 ASSERT_EQ(14 + offset, indexList.size());
74 EXPECT_STREQ(L"ansi.txt", indexList[offset].m_FileName);
75 EXPECT_EQ(102, indexList[offset].m_Size);
76 EXPECT_EQ(8, indexList[offset].m_Flags);
77 EXPECT_STREQ(L"961bdffbfce1bc617fb594091c3229f1cc674d76", indexList[offset].m_IndexHash.ToString());
78 EXPECT_STREQ(L"copy/ansi.txt", indexList[1 + offset].m_FileName);
79 EXPECT_EQ(103, indexList[1 + offset].m_Size);
80 EXPECT_EQ(13, indexList[1 + offset].m_Flags);
81 EXPECT_STREQ(L"4c44667203f943dc5dbdf3cb526cb7ec24f60c09", indexList[1 + offset].m_IndexHash.ToString());
82 EXPECT_STREQ(L"copy/utf16-le-nobom.txt", indexList[5 + offset].m_FileName);
83 EXPECT_EQ(218, indexList[5 + offset].m_Size);
84 EXPECT_EQ(23, indexList[5 + offset].m_Flags);
85 EXPECT_STREQ(L"fbea9ccd85c33fcdb542d8c73f910ea0e70c3ddc", indexList[5 + offset].m_IndexHash.ToString());
86 EXPECT_STREQ(L"utf8-nobom.txt", indexList[13 + offset].m_FileName);
87 EXPECT_EQ(139, indexList[13 + offset].m_Size);
88 EXPECT_EQ(14, indexList[13 + offset].m_Flags);
89 EXPECT_STREQ(L"c225b3f14869ec8b6da32d52bd15dba0b043031d", indexList[13 + offset].m_IndexHash.ToString());
92 TEST_P(GitIndexCBasicGitWithTestRepoFixture, ReadIndex)
94 CGitIndexList indexList;
95 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
97 CString testFile = m_Dir.GetTempDir() + L"\\1.txt";
98 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)testFile, L"this is testing file."));
99 CString output;
100 EXPECT_EQ(0, m_Git.Run(_T("git.exe add 1.txt"), &output, CP_UTF8));
101 EXPECT_TRUE(output.IsEmpty());
103 ReadAndCheckIndex(indexList, m_Dir.GetTempDir(), 1);
105 EXPECT_STREQ(L"1.txt", indexList[0].m_FileName);
106 EXPECT_EQ(21, indexList[0].m_Size);
107 EXPECT_EQ(5, indexList[0].m_Flags);
108 EXPECT_STREQ(L"e4aac1275dfc440ec521a76e9458476fe07038bb", indexList[0].m_IndexHash.ToString());
110 EXPECT_EQ(0, m_Git.Run(_T("git.exe rm -f 1.txt"), &output, CP_UTF8));
112 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
115 TEST_P(GitIndexCBasicGitWithTestRepoFixture, GetFileStatus)
117 CGitIndexList indexList;
118 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
120 git_wc_status_kind status = git_wc_status_none;
121 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"does-not-exist.txt", &status, 10, 20));
122 EXPECT_EQ(git_wc_status_unversioned, status);
124 __int64 time = -1;
125 __int64 filesize = -1;
126 status = git_wc_status_none;
127 bool skipworktree = false;
128 EXPECT_EQ(-1, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
129 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
130 EXPECT_EQ(git_wc_status_modified, status);
132 CString output;
133 EXPECT_EQ(0, m_Git.Run(_T("git.exe reset --hard"), &output, CP_UTF8));
135 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
136 status = git_wc_status_none;
137 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
138 EXPECT_EQ(git_wc_status_normal, status);
140 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), L"this is testing file."));
141 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
142 status = git_wc_status_none;
143 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize, nullptr, nullptr, nullptr, nullptr, &skipworktree));
144 EXPECT_EQ(git_wc_status_modified, status);
145 EXPECT_FALSE(skipworktree);
147 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this is testing file."));
148 EXPECT_EQ(0, m_Git.Run(_T("git.exe add -- just-added.txt"), &output, CP_UTF8));
150 EXPECT_EQ(0, m_Git.Run(_T("git.exe update-index --skip-worktree -- ansi.txt"), &output, CP_UTF8));
151 EXPECT_EQ(0, indexList.ReadIndex(m_Dir.GetTempDir()));
152 status = git_wc_status_none;
153 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize, nullptr, nullptr, nullptr, nullptr, &skipworktree));
154 EXPECT_EQ(git_wc_status_normal, status);
155 EXPECT_TRUE(skipworktree);
157 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
158 status = git_wc_status_none;
159 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", &status, time, filesize));
160 EXPECT_EQ(git_wc_status_normal, status);
162 EXPECT_EQ(0, m_Git.Run(_T("git.exe update-index --no-skip-worktree ansi.txt"), &output, CP_UTF8));
164 Sleep(1000);
165 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this IS testing file."));
166 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
167 status = git_wc_status_none;
168 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", &status, time, filesize));
169 EXPECT_EQ(git_wc_status_modified, status);
171 output.Empty();
172 EXPECT_EQ(0, m_Git.Run(_T("git.exe checkout --force forconflict"), &output, CP_UTF8));
173 EXPECT_FALSE(output.IsEmpty());
175 output.Empty();
176 EXPECT_EQ(1, m_Git.Run(_T("git.exe merge simple-conflict"), &output, CP_UTF8));
177 EXPECT_FALSE(output.IsEmpty());
179 EXPECT_EQ(0, indexList.ReadIndex(m_Dir.GetTempDir()));
180 EXPECT_EQ(9, indexList.size());
182 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
183 status = git_wc_status_none;
184 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
185 EXPECT_EQ(git_wc_status_conflicted, status);
188 TEST(GitIndex, SearchInSortVector)
190 std::vector<CGitFileName> vector;
191 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
192 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 0));
193 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", -1));
195 vector.push_back(CGitFileName(L"One"));
196 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
197 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", -1));
198 EXPECT_EQ(0, SearchInSortVector(vector, L"something", 0)); // do we really need this behavior?
199 EXPECT_EQ(0, SearchInSortVector(vector, L"one", 3));
200 EXPECT_EQ(0, SearchInSortVector(vector, L"one", -1));
201 EXPECT_EQ(-1, SearchInSortVector(vector, L"one/", 4));
202 EXPECT_EQ(-1, SearchInSortVector(vector, L"One", 3));
204 vector.push_back(CGitFileName(L"tWo"));
205 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
206 EXPECT_EQ(0, SearchInSortVector(vector, L"one", 3));
207 EXPECT_EQ(-1, SearchInSortVector(vector, L"One", 3));
208 EXPECT_EQ(1, SearchInSortVector(vector, L"two", 3));
209 EXPECT_EQ(-1, SearchInSortVector(vector, L"tWo", 3));
210 EXPECT_EQ(1, SearchInSortVector(vector, L"t", 1));
211 EXPECT_EQ(-1, SearchInSortVector(vector, L"0", 1));
212 EXPECT_EQ(-1, SearchInSortVector(vector, L"z", 1));
214 vector.push_back(CGitFileName(L"a"));
215 vector.push_back(CGitFileName(L"b/1"));
216 vector.push_back(CGitFileName(L"b/2"));
217 vector.push_back(CGitFileName(L"b/3"));
218 vector.push_back(CGitFileName(L"b/4"));
219 vector.push_back(CGitFileName(L"b/5"));
220 std::sort(vector.begin(), vector.end(), SortCGitFileName);
221 EXPECT_EQ(2, SearchInSortVector(vector, L"b/2", 3));
222 EXPECT_EQ(2, SearchInSortVector(vector, L"b/2", -1));
223 EXPECT_EQ(3, SearchInSortVector(vector, L"b/", 2));
224 EXPECT_EQ(-1, SearchInSortVector(vector, L"b/6", 3));
225 EXPECT_EQ(0, SearchInSortVector(vector, L"a", 1));
226 EXPECT_EQ(6, SearchInSortVector(vector, L"one", 3));
227 EXPECT_EQ(7, SearchInSortVector(vector, L"two", 3));
230 TEST(GitIndex, GetRangeInSortVector)
232 std::vector<CGitFileName> vector;
234 int start = -2;
235 int end = -2;
236 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, -1));
237 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, 0));
238 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, nullptr, 0));
239 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 0));
240 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 1));
241 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"", 0, &start, &end, 0));
242 EXPECT_EQ(-1, start);
243 EXPECT_EQ(-1, end);
245 vector.push_back(CGitFileName(L"a"));
246 start = end = -2;
247 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, -1));
248 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, nullptr, 0));
249 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 0));
250 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 1));
252 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, &start, &end, -1));
253 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, &start, nullptr, 0));
254 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, nullptr, &end, 0));
255 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, nullptr, &end, 1));
256 start = end = -2;
257 EXPECT_EQ(0, GetRangeInSortVector(vector, L"", 0, &start, &end, 0));
258 EXPECT_EQ(0, start);
259 EXPECT_EQ(0, end);
260 start = end = -2;
261 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"", 0, &start, &end, 1));
263 start = end = -2;
264 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"0", 1, &start, &end, 0));
265 EXPECT_EQ(-1, start);
266 EXPECT_EQ(-1, end);
267 start = end = -2;
268 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b", 1, &start, &end, 0));
269 EXPECT_EQ(-1, start);
270 EXPECT_EQ(-1, end);
272 start = end = -2;
273 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, &start, &end, 0));
274 EXPECT_EQ(0, start);
275 EXPECT_EQ(0, end);
277 vector.push_back(CGitFileName(L"b/1"));
278 vector.push_back(CGitFileName(L"b/2"));
279 vector.push_back(CGitFileName(L"b/3"));
280 vector.push_back(CGitFileName(L"b/4"));
281 vector.push_back(CGitFileName(L"b/5"));
283 start = end = -2;
284 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, &start, &end, 0));
285 EXPECT_EQ(0, start);
286 EXPECT_EQ(0, end);
288 start = end = -2;
289 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 1));
290 EXPECT_EQ(1, start);
291 EXPECT_EQ(5, end);
293 start = end = -2;
294 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 2));
295 EXPECT_EQ(1, start);
296 EXPECT_EQ(5, end);
298 start = end = -2;
299 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 4));
300 EXPECT_EQ(1, start);
301 EXPECT_EQ(5, end);
303 start = end = -2;
304 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 5));
305 EXPECT_EQ(1, start);
306 EXPECT_EQ(5, end);
308 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 6)); // 6 is >= vector.size()
310 start = end = -2;
311 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 0));
312 EXPECT_EQ(-1, start);
313 EXPECT_EQ(-1, end);
315 start = end = -2;
316 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 5));
317 EXPECT_EQ(-1, start);
318 EXPECT_EQ(-1, end);
320 vector.push_back(CGitFileName(L"c"));
321 vector.push_back(CGitFileName(L"d"));
323 start = end = -2;
324 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 1));
325 EXPECT_EQ(1, start);
326 EXPECT_EQ(5, end);
328 start = end = -2;
329 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 2));
330 EXPECT_EQ(1, start);
331 EXPECT_EQ(5, end);
333 start = end = -2;
334 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 4));
335 EXPECT_EQ(1, start);
336 EXPECT_EQ(5, end);
338 start = end = -2;
339 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 5));
340 EXPECT_EQ(1, start);
341 EXPECT_EQ(5, end);
343 start = end = -2;
344 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 6));
345 EXPECT_EQ(-1, start);
346 EXPECT_EQ(-1, end);
348 start = end = -2;
349 EXPECT_EQ(0, GetRangeInSortVector(vector, L"c", 1, &start, &end, 6));
350 EXPECT_EQ(6, start);
351 EXPECT_EQ(6, end);
353 start = end = -2;
354 EXPECT_EQ(0, GetRangeInSortVector(vector, L"", 0, &start, &end, 0));
355 EXPECT_EQ(0, start);
356 EXPECT_EQ(7, end);
359 TEST(GitIndex, CGitIgnoreItem)
361 CAutoTempDir tempDir;
362 CGitIgnoreItem ignoreItem;
364 int type = DT_DIR;
365 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
366 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
367 type = DT_REG;
368 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
369 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
371 EXPECT_EQ(-1, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), L"does-not-exist", false));
372 EXPECT_EQ(-1, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), L"does-not-exist", true));
374 CString ignoreFile = tempDir.GetTempDir() + L"\\.gitignore";
376 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L""));
377 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
378 EXPECT_STREQ("", ignoreItem.m_BaseDir);
379 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
380 EXPECT_STREQ("", ignoreItem.m_BaseDir);
382 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"#"));
383 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
384 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
386 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"# comment"));
387 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
388 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
390 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"\n"));
391 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
392 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
394 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"\n#"));
395 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
396 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
398 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"*.tmp\n"));
399 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
400 type = DT_DIR;
401 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
402 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
403 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
404 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
405 type = DT_REG;
406 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
407 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
408 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
409 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
410 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
411 type = DT_DIR;
412 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
413 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
414 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
415 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
416 type = DT_REG;
417 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
418 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
419 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
420 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
422 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-file\n"));
423 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
424 type = DT_DIR;
425 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
426 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
427 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
428 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
429 type = DT_REG;
430 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
431 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
432 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
433 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
434 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
435 type = DT_DIR;
436 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
437 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
438 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
439 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
440 type = DT_REG;
441 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
442 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
443 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
444 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
446 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"\n\nsome-file\n"));
447 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
448 type = DT_DIR;
449 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
450 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
451 type = DT_REG;
452 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
453 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
454 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
455 type = DT_DIR;
456 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
457 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
458 type = DT_REG;
459 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
460 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
462 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"/some-file"));
463 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
464 type = DT_DIR;
465 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
466 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
467 type = DT_REG;
468 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
469 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
470 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
471 type = DT_DIR;
472 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
473 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
474 type = DT_REG;
475 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
476 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
478 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-dir/"));
479 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
480 type = DT_DIR;
481 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
482 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
483 type = DT_REG;
484 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-file", type));
485 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
486 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
487 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
488 type = DT_DIR;
489 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
490 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
491 type = DT_REG;
492 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-file", type));
493 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
494 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
496 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-*\n!some-file"));
497 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
498 type = DT_DIR;
499 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
500 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
501 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
502 type = DT_REG;
503 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
504 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
505 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
506 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
507 type = DT_DIR;
508 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
509 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
510 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
511 type = DT_REG;
512 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
513 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
514 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
516 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-file\nanother/dir/*"));
517 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
518 type = DT_DIR;
519 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
520 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
521 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
522 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
523 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
524 type = DT_REG;
525 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
526 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
527 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
528 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
529 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
530 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
531 type = DT_DIR;
532 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
533 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
534 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
535 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
536 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
537 type = DT_REG;
538 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
539 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
540 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
541 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
542 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
544 EXPECT_TRUE(::CreateDirectory(tempDir.GetTempDir() + L"\\subdir", nullptr));
545 ignoreFile = tempDir.GetTempDir() + L"\\subdir\\.gitignore";
546 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"/something"));
547 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
548 EXPECT_STREQ("subdir/", ignoreItem.m_BaseDir);
549 type = DT_DIR;
550 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
551 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
552 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
553 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
554 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
555 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
556 type = DT_REG;
557 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
558 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
559 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
560 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
561 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
562 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
563 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
564 EXPECT_STREQ("", ignoreItem.m_BaseDir);
565 type = DT_DIR;
566 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
567 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
568 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
569 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something", type));
570 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
571 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
572 type = DT_REG;
573 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
574 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
575 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
576 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something", type));
577 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
578 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
580 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"something"));
581 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
582 EXPECT_STREQ("subdir/", ignoreItem.m_BaseDir);
583 type = DT_DIR;
584 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
585 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
586 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
587 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
588 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
589 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
590 type = DT_REG;
591 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
592 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
593 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
594 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
595 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
596 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
597 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
598 EXPECT_STREQ("", ignoreItem.m_BaseDir);
599 type = DT_DIR;
600 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
601 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
602 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
603 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
604 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
605 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
606 type = DT_REG;
607 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
608 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
609 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
610 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
611 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
612 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));