Fix possible problems with "intend to add" staged files
[TortoiseGit.git] / test / UnitTests / GitIndexTest.cpp
blobd23645a0c1b4287251dac2f2e402ae0bd1cea8ea
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2015-2016 - 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());
66 EXPECT_FALSE(indexList.m_bHasConflicts);
70 static void ReadAndCheckIndex(CGitIndexList& indexList, const CString& gitdir, int offset = 0)
72 EXPECT_EQ(0, indexList.ReadIndex(gitdir));
73 ASSERT_EQ(14 + offset, indexList.size());
75 EXPECT_STREQ(L"ansi.txt", indexList[offset].m_FileName);
76 EXPECT_EQ(102, indexList[offset].m_Size);
77 EXPECT_EQ(8, indexList[offset].m_Flags);
78 EXPECT_EQ(0, indexList[offset].m_FlagsExtended);
79 EXPECT_STREQ(L"961bdffbfce1bc617fb594091c3229f1cc674d76", indexList[offset].m_IndexHash.ToString());
80 EXPECT_STREQ(L"copy/ansi.txt", indexList[1 + offset].m_FileName);
81 EXPECT_EQ(103, indexList[1 + offset].m_Size);
82 EXPECT_EQ(13, indexList[1 + offset].m_Flags);
83 EXPECT_EQ(0, indexList[1 + offset].m_FlagsExtended);
84 EXPECT_STREQ(L"4c44667203f943dc5dbdf3cb526cb7ec24f60c09", indexList[1 + offset].m_IndexHash.ToString());
85 EXPECT_STREQ(L"copy/utf16-le-nobom.txt", indexList[5 + offset].m_FileName);
86 EXPECT_EQ(218, indexList[5 + offset].m_Size);
87 EXPECT_EQ(23, indexList[5 + offset].m_Flags);
88 EXPECT_EQ(0, indexList[5 + offset].m_FlagsExtended);
89 EXPECT_STREQ(L"fbea9ccd85c33fcdb542d8c73f910ea0e70c3ddc", indexList[5 + offset].m_IndexHash.ToString());
90 EXPECT_STREQ(L"utf8-nobom.txt", indexList[13 + offset].m_FileName);
91 EXPECT_EQ(139, indexList[13 + offset].m_Size);
92 EXPECT_EQ(14, indexList[13 + offset].m_Flags);
93 EXPECT_EQ(0, indexList[13 + offset].m_FlagsExtended);
94 EXPECT_STREQ(L"c225b3f14869ec8b6da32d52bd15dba0b043031d", indexList[13 + offset].m_IndexHash.ToString());
95 EXPECT_FALSE(indexList.m_bHasConflicts);
98 TEST_P(GitIndexCBasicGitWithTestRepoFixture, ReadIndex)
100 CGitIndexList indexList;
101 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
103 CString testFile = m_Dir.GetTempDir() + L"\\1.txt";
104 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)testFile, L"this is testing file."));
105 CString output;
106 EXPECT_EQ(0, m_Git.Run(_T("git.exe add 1.txt"), &output, CP_UTF8));
107 EXPECT_TRUE(output.IsEmpty());
109 ReadAndCheckIndex(indexList, m_Dir.GetTempDir(), 1);
111 EXPECT_STREQ(L"1.txt", indexList[0].m_FileName);
112 EXPECT_EQ(21, indexList[0].m_Size);
113 EXPECT_EQ(5, indexList[0].m_Flags);
114 EXPECT_EQ(0, indexList[0].m_FlagsExtended);
115 EXPECT_STREQ(L"e4aac1275dfc440ec521a76e9458476fe07038bb", indexList[0].m_IndexHash.ToString());
117 EXPECT_EQ(0, m_Git.Run(_T("git.exe rm -f 1.txt"), &output, CP_UTF8));
119 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
121 output.Empty();
122 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)testFile, L"this is testing file."));
123 EXPECT_EQ(0, m_Git.Run(_T("git.exe add -N 1.txt"), &output, CP_UTF8));
124 EXPECT_TRUE(output.IsEmpty());
126 ReadAndCheckIndex(indexList, m_Dir.GetTempDir(), 1);
128 EXPECT_STREQ(L"1.txt", indexList[0].m_FileName);
129 EXPECT_EQ(0, indexList[0].m_Size);
130 EXPECT_EQ(16389, indexList[0].m_Flags);
131 EXPECT_EQ(GIT_IDXENTRY_INTENT_TO_ADD, indexList[0].m_FlagsExtended);
132 EXPECT_STREQ(L"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", indexList[0].m_IndexHash.ToString());
135 TEST_P(GitIndexCBasicGitWithTestRepoFixture, GetFileStatus)
137 CGitIndexList indexList;
138 ReadAndCheckIndex(indexList, m_Dir.GetTempDir());
140 git_wc_status_kind status = git_wc_status_none;
141 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"does-not-exist.txt", &status, 10, 20));
142 EXPECT_EQ(git_wc_status_unversioned, status);
144 __int64 time = -1;
145 __int64 filesize = -1;
146 status = git_wc_status_none;
147 bool skipworktree = false;
148 EXPECT_EQ(-1, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
149 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
150 EXPECT_EQ(git_wc_status_modified, status);
152 CString output;
153 EXPECT_EQ(0, m_Git.Run(_T("git.exe reset --hard"), &output, CP_UTF8));
155 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
156 status = git_wc_status_none;
157 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
158 EXPECT_EQ(git_wc_status_normal, status);
160 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), L"this is testing file."));
161 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
162 status = git_wc_status_none;
163 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize, nullptr, nullptr, nullptr, nullptr, &skipworktree));
164 EXPECT_EQ(git_wc_status_modified, status);
165 EXPECT_FALSE(skipworktree);
167 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this is testing file."));
168 EXPECT_EQ(0, m_Git.Run(_T("git.exe add -- just-added.txt"), &output, CP_UTF8));
170 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"noted-as-added.txt"), L"this is testing file."));
171 EXPECT_EQ(0, m_Git.Run(_T("git.exe add -N -- noted-as-added.txt"), &output, CP_UTF8));
173 EXPECT_EQ(0, m_Git.Run(_T("git.exe update-index --skip-worktree -- ansi.txt"), &output, CP_UTF8));
174 EXPECT_EQ(0, indexList.ReadIndex(m_Dir.GetTempDir()));
175 EXPECT_FALSE(indexList.m_bHasConflicts);
176 status = git_wc_status_none;
177 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize, nullptr, nullptr, nullptr, nullptr, &skipworktree));
178 EXPECT_EQ(git_wc_status_normal, status);
179 EXPECT_TRUE(skipworktree);
181 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
182 status = git_wc_status_none;
183 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", &status, time, filesize));
184 EXPECT_EQ(git_wc_status_normal, status);
186 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"noted-as-added.txt"), &time, nullptr, &filesize));
187 status = git_wc_status_none;
188 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"noted-as-added.txt", &status, time, filesize));
189 EXPECT_EQ(git_wc_status_added, status);
191 EXPECT_EQ(0, m_Git.Run(_T("git.exe update-index --no-skip-worktree ansi.txt"), &output, CP_UTF8));
193 Sleep(1000);
194 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), L"this IS testing file."));
195 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"just-added.txt"), &time, nullptr, &filesize));
196 status = git_wc_status_none;
197 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"just-added.txt", &status, time, filesize));
198 EXPECT_EQ(git_wc_status_modified, status);
200 output.Empty();
201 EXPECT_EQ(0, m_Git.Run(_T("git.exe checkout --force forconflict"), &output, CP_UTF8));
202 EXPECT_FALSE(output.IsEmpty());
204 output.Empty();
205 EXPECT_EQ(1, m_Git.Run(_T("git.exe merge simple-conflict"), &output, CP_UTF8));
206 EXPECT_FALSE(output.IsEmpty());
208 EXPECT_EQ(0, indexList.ReadIndex(m_Dir.GetTempDir()));
209 EXPECT_EQ(9, indexList.size());
210 EXPECT_TRUE(indexList.m_bHasConflicts);
212 EXPECT_EQ(0, CGit::GetFileModifyTime(CombinePath(m_Dir.GetTempDir(), L"ansi.txt"), &time, nullptr, &filesize));
213 status = git_wc_status_none;
214 EXPECT_EQ(0, indexList.GetFileStatus(m_Dir.GetTempDir(), L"ansi.txt", &status, time, filesize));
215 EXPECT_EQ(git_wc_status_conflicted, status);
218 TEST(GitIndex, SearchInSortVector)
220 std::vector<CGitFileName> vector;
221 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
222 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 0));
223 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", -1));
225 vector.push_back(CGitFileName(L"One"));
226 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
227 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", -1));
228 EXPECT_EQ(0, SearchInSortVector(vector, L"something", 0)); // do we really need this behavior?
229 EXPECT_EQ(0, SearchInSortVector(vector, L"one", 3));
230 EXPECT_EQ(0, SearchInSortVector(vector, L"one", -1));
231 EXPECT_EQ(-1, SearchInSortVector(vector, L"one/", 4));
232 EXPECT_EQ(-1, SearchInSortVector(vector, L"One", 3));
234 vector.push_back(CGitFileName(L"tWo"));
235 EXPECT_EQ(-1, SearchInSortVector(vector, L"something", 9));
236 EXPECT_EQ(0, SearchInSortVector(vector, L"one", 3));
237 EXPECT_EQ(-1, SearchInSortVector(vector, L"One", 3));
238 EXPECT_EQ(1, SearchInSortVector(vector, L"two", 3));
239 EXPECT_EQ(-1, SearchInSortVector(vector, L"tWo", 3));
240 EXPECT_EQ(1, SearchInSortVector(vector, L"t", 1));
241 EXPECT_EQ(-1, SearchInSortVector(vector, L"0", 1));
242 EXPECT_EQ(-1, SearchInSortVector(vector, L"z", 1));
244 vector.push_back(CGitFileName(L"a"));
245 vector.push_back(CGitFileName(L"b/1"));
246 vector.push_back(CGitFileName(L"b/2"));
247 vector.push_back(CGitFileName(L"b/3"));
248 vector.push_back(CGitFileName(L"b/4"));
249 vector.push_back(CGitFileName(L"b/5"));
250 std::sort(vector.begin(), vector.end(), SortCGitFileName);
251 EXPECT_EQ(2, SearchInSortVector(vector, L"b/2", 3));
252 EXPECT_EQ(2, SearchInSortVector(vector, L"b/2", -1));
253 EXPECT_EQ(3, SearchInSortVector(vector, L"b/", 2));
254 EXPECT_EQ(-1, SearchInSortVector(vector, L"b/6", 3));
255 EXPECT_EQ(0, SearchInSortVector(vector, L"a", 1));
256 EXPECT_EQ(6, SearchInSortVector(vector, L"one", 3));
257 EXPECT_EQ(7, SearchInSortVector(vector, L"two", 3));
260 TEST(GitIndex, GetRangeInSortVector)
262 std::vector<CGitFileName> vector;
264 int start = -2;
265 int end = -2;
266 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, -1));
267 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, 0));
268 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, nullptr, 0));
269 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 0));
270 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 1));
271 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"", 0, &start, &end, 0));
272 EXPECT_EQ(-1, start);
273 EXPECT_EQ(-1, end);
275 vector.push_back(CGitFileName(L"a"));
276 start = end = -2;
277 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, &end, -1));
278 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, &start, nullptr, 0));
279 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 0));
280 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"something", 9, nullptr, &end, 1));
282 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, &start, &end, -1));
283 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, &start, nullptr, 0));
284 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, nullptr, &end, 0));
285 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"a", 1, nullptr, &end, 1));
286 start = end = -2;
287 EXPECT_EQ(0, GetRangeInSortVector(vector, L"", 0, &start, &end, 0));
288 EXPECT_EQ(0, start);
289 EXPECT_EQ(0, end);
290 start = end = -2;
291 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"", 0, &start, &end, 1));
293 start = end = -2;
294 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"0", 1, &start, &end, 0));
295 EXPECT_EQ(-1, start);
296 EXPECT_EQ(-1, end);
297 start = end = -2;
298 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b", 1, &start, &end, 0));
299 EXPECT_EQ(-1, start);
300 EXPECT_EQ(-1, end);
302 start = end = -2;
303 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, &start, &end, 0));
304 EXPECT_EQ(0, start);
305 EXPECT_EQ(0, end);
307 vector.push_back(CGitFileName(L"b/1"));
308 vector.push_back(CGitFileName(L"b/2"));
309 vector.push_back(CGitFileName(L"b/3"));
310 vector.push_back(CGitFileName(L"b/4"));
311 vector.push_back(CGitFileName(L"b/5"));
313 start = end = -2;
314 EXPECT_EQ(0, GetRangeInSortVector(vector, L"a", 1, &start, &end, 0));
315 EXPECT_EQ(0, start);
316 EXPECT_EQ(0, end);
318 start = end = -2;
319 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 1));
320 EXPECT_EQ(1, start);
321 EXPECT_EQ(5, end);
323 start = end = -2;
324 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 2));
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, 4));
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, 5));
335 EXPECT_EQ(1, start);
336 EXPECT_EQ(5, end);
338 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 6)); // 6 is >= vector.size()
340 start = end = -2;
341 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 0));
342 EXPECT_EQ(-1, start);
343 EXPECT_EQ(-1, end);
345 start = end = -2;
346 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 5));
347 EXPECT_EQ(-1, start);
348 EXPECT_EQ(-1, end);
350 vector.push_back(CGitFileName(L"c"));
351 vector.push_back(CGitFileName(L"d"));
353 start = end = -2;
354 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 1));
355 EXPECT_EQ(1, start);
356 EXPECT_EQ(5, end);
358 start = end = -2;
359 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 2));
360 EXPECT_EQ(1, start);
361 EXPECT_EQ(5, end);
363 start = end = -2;
364 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 4));
365 EXPECT_EQ(1, start);
366 EXPECT_EQ(5, end);
368 start = end = -2;
369 EXPECT_EQ(0, GetRangeInSortVector(vector, L"b/", 2, &start, &end, 5));
370 EXPECT_EQ(1, start);
371 EXPECT_EQ(5, end);
373 start = end = -2;
374 EXPECT_EQ(-1, GetRangeInSortVector(vector, L"c/", 2, &start, &end, 6));
375 EXPECT_EQ(-1, start);
376 EXPECT_EQ(-1, end);
378 start = end = -2;
379 EXPECT_EQ(0, GetRangeInSortVector(vector, L"c", 1, &start, &end, 6));
380 EXPECT_EQ(6, start);
381 EXPECT_EQ(6, end);
383 start = end = -2;
384 EXPECT_EQ(0, GetRangeInSortVector(vector, L"", 0, &start, &end, 0));
385 EXPECT_EQ(0, start);
386 EXPECT_EQ(7, end);
389 TEST(GitIndex, CGitIgnoreItem)
391 CAutoTempDir tempDir;
392 CGitIgnoreItem ignoreItem;
394 int type = DT_DIR;
395 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
396 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
397 type = DT_REG;
398 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
399 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
401 EXPECT_EQ(-1, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), L"does-not-exist", false));
402 EXPECT_EQ(-1, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), L"does-not-exist", true));
404 CString ignoreFile = tempDir.GetTempDir() + L"\\.gitignore";
406 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L""));
407 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
408 EXPECT_STREQ("", ignoreItem.m_BaseDir);
409 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
410 EXPECT_STREQ("", ignoreItem.m_BaseDir);
412 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"#"));
413 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
414 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
416 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"# comment"));
417 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
418 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
420 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"\n"));
421 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
422 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
424 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"\n#"));
425 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
426 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
428 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"*.tmp\n"));
429 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
430 type = DT_DIR;
431 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
432 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
433 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
434 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
435 type = DT_REG;
436 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
437 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
438 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
439 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
440 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
441 type = DT_DIR;
442 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
443 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
444 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
445 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
446 type = DT_REG;
447 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
448 EXPECT_EQ(1, ignoreItem.IsPathIgnored("text.tmp", type));
449 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/text.tmp", type));
450 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("1.tmp.1", type));
452 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-file\n"));
453 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
454 type = DT_DIR;
455 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
456 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
457 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
458 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
459 type = DT_REG;
460 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
461 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
462 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
463 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
464 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
465 type = DT_DIR;
466 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
467 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
468 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
469 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
470 type = DT_REG;
471 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("not-ignored", type));
472 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/not-ignored", type));
473 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
474 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
476 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"\n\nsome-file\n"));
477 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
478 type = DT_DIR;
479 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
480 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
481 type = DT_REG;
482 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
483 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
484 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
485 type = DT_DIR;
486 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
487 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
488 type = DT_REG;
489 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
490 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-file", type));
492 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"/some-file"));
493 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
494 type = DT_DIR;
495 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
496 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
497 type = DT_REG;
498 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
499 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
500 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
501 type = DT_DIR;
502 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
503 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
504 type = DT_REG;
505 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
506 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-file", type));
508 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-dir/"));
509 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
510 type = DT_DIR;
511 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
512 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
513 type = DT_REG;
514 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-file", type));
515 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
516 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
517 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
518 type = DT_DIR;
519 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
520 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
521 type = DT_REG;
522 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-file", type));
523 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
524 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/some-file", type));
526 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-*\n!some-file"));
527 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
528 type = DT_DIR;
529 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
530 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
531 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
532 type = DT_REG;
533 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
534 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
535 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
536 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
537 type = DT_DIR;
538 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
539 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
540 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
541 type = DT_REG;
542 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir", type));
543 EXPECT_EQ(0, ignoreItem.IsPathIgnored("some-file", type));
544 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
546 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"some-file\nanother/dir/*"));
547 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
548 type = DT_DIR;
549 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
550 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
551 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
552 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
553 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
554 type = DT_REG;
555 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
556 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
557 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
558 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
559 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
560 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
561 type = DT_DIR;
562 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
563 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
564 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
565 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
566 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
567 type = DT_REG;
568 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir", type));
569 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-file", type));
570 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another", type));
571 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("another/dir", type));
572 EXPECT_EQ(1, ignoreItem.IsPathIgnored("another/dir/some", type));
574 EXPECT_TRUE(::CreateDirectory(tempDir.GetTempDir() + L"\\subdir", nullptr));
575 ignoreFile = tempDir.GetTempDir() + L"\\subdir\\.gitignore";
576 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"/something"));
577 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
578 EXPECT_STREQ("subdir/", ignoreItem.m_BaseDir);
579 type = DT_DIR;
580 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
581 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
582 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
583 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
584 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
585 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
586 type = DT_REG;
587 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something", type));
588 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
589 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
590 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
591 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
592 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
593 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
594 EXPECT_STREQ("", ignoreItem.m_BaseDir);
595 type = DT_DIR;
596 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
597 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
598 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
599 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something", type));
600 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
601 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
602 type = DT_REG;
603 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
604 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
605 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("some-dir/something", type));
606 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something", type));
607 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
608 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
610 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR)ignoreFile, L"something"));
611 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, false));
612 EXPECT_STREQ("subdir/", ignoreItem.m_BaseDir);
613 type = DT_DIR;
614 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
615 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
616 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
617 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
618 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
619 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
620 type = DT_REG;
621 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
622 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
623 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
624 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
625 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
626 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
627 EXPECT_EQ(0, ignoreItem.FetchIgnoreList(tempDir.GetTempDir(), ignoreFile, true));
628 EXPECT_STREQ("", ignoreItem.m_BaseDir);
629 type = DT_DIR;
630 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
631 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
632 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
633 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
634 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
635 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));
636 type = DT_REG;
637 EXPECT_EQ(1, ignoreItem.IsPathIgnored("something", type));
638 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("something/more", type));
639 EXPECT_EQ(1, ignoreItem.IsPathIgnored("some-dir/something", type));
640 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/something", type));
641 EXPECT_EQ(-1, ignoreItem.IsPathIgnored("subdir/something/more", type));
642 EXPECT_EQ(1, ignoreItem.IsPathIgnored("subdir/some-dir/something", type));