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.
22 #include "StringUtils.h"
23 #include "RepositoryFixtures.h"
25 // For performance reason, turn LIBGIT off by default,
26 INSTANTIATE_TEST_CASE_P(CGit
, CBasicGitFixture
, testing::Values(GIT_CLI
, /*LIBGIT,*/ LIBGIT2
, LIBGIT2_ALL
));
27 INSTANTIATE_TEST_CASE_P(CGit
, CBasicGitWithEmptyRepositoryFixture
, testing::Values(GIT_CLI
, /*LIBGIT,*/ LIBGIT2
, LIBGIT2_ALL
));
28 INSTANTIATE_TEST_CASE_P(CGit
, CBasicGitWithEmptyBareRepositoryFixture
, testing::Values(GIT_CLI
, /*LIBGIT,*/ LIBGIT2
, LIBGIT2_ALL
));
29 INSTANTIATE_TEST_CASE_P(CGit
, CBasicGitWithTestRepoFixture
, testing::Values(GIT_CLI
, LIBGIT
, LIBGIT2
, LIBGIT2_ALL
));
30 INSTANTIATE_TEST_CASE_P(CGit
, CBasicGitWithTestRepoBareFixture
, testing::Values(GIT_CLI
, LIBGIT
, LIBGIT2
, LIBGIT2_ALL
));
36 ASSERT_EQ(0, cgit
.Run(_T("cmd /c set"), &output
, CP_UTF8
));
37 ASSERT_FALSE(output
.IsEmpty());
38 ASSERT_TRUE(output
.Find(_T("windir"))); // should be there on any MS OS ;)
45 ASSERT_EQ(0, cgit
.Run(_T("git --version"), &output
, CP_UTF8
));
46 ASSERT_FALSE(output
.IsEmpty());
49 TEST(CGit
, RunGit_Error
)
53 cgit
.m_CurrentDir
= tempdir
.GetTempDir();
56 EXPECT_NE(0, cgit
.Run(_T("git-not-found.exe"), &output
, CP_UTF8
)); // Git for Windows returns 2, cygwin-hack returns 127
57 //EXPECT_TRUE(output.IsEmpty()); with cygwin-hack we get an error message from sh.exe
60 EXPECT_EQ(128, cgit
.Run(_T("git.exe add file.txt"), &output
, CP_UTF8
));
61 EXPECT_TRUE(output
.Find(_T("fatal: Not a git repository (or any")) == 0);
64 TEST(CGit
, StringAppend
)
66 CGit::StringAppend(nullptr, nullptr); // string may be null
67 CString string
= _T("something");
68 CGit::StringAppend(&string
, nullptr, CP_UTF8
, 0);
69 EXPECT_STREQ(_T("something"), string
);
70 const BYTE somebytes
[1] = { 0 };
71 CGit::StringAppend(&string
, somebytes
, CP_UTF8
, 0);
72 EXPECT_STREQ(_T("something"), string
);
73 CGit::StringAppend(&string
, somebytes
);
74 EXPECT_STREQ(_T("something"), string
);
75 const BYTE moreBytesUTFEight
[] = { 0x68, 0x65, 0x6C, 0x6C, 0xC3, 0xB6, 0x0A, 0x00 };
76 CGit::StringAppend(&string
, moreBytesUTFEight
, CP_UTF8
, 3);
77 EXPECT_STREQ(_T("somethinghel"), string
);
78 CGit::StringAppend(&string
, moreBytesUTFEight
+ 3, CP_ACP
, 1);
79 EXPECT_STREQ(_T("somethinghell"), string
);
80 CGit::StringAppend(&string
, moreBytesUTFEight
);
81 EXPECT_STREQ(_T("somethinghellhellö\n"), string
);
82 CGit::StringAppend(&string
, moreBytesUTFEight
, CP_UTF8
, sizeof(moreBytesUTFEight
));
83 EXPECT_STREQ(_T("somethinghellhellö\nhellö\n\0"), string
);
84 CGit::StringAppend(&string
, moreBytesUTFEight
, CP_UTF8
, 3);
85 EXPECT_STREQ(_T("somethinghellhellö\nhellö\n\0hel"), string
);
88 TEST(CGit
, IsBranchNameValid
)
91 EXPECT_TRUE(cgit
.IsBranchNameValid(_T("master")));
92 EXPECT_TRUE(cgit
.IsBranchNameValid(_T("def/master")));
93 EXPECT_FALSE(cgit
.IsBranchNameValid(_T("-test")));
94 EXPECT_FALSE(cgit
.IsBranchNameValid(_T("jfjf>ff")));
95 EXPECT_FALSE(cgit
.IsBranchNameValid(_T("jf ff")));
96 EXPECT_FALSE(cgit
.IsBranchNameValid(_T("jf~ff")));
99 TEST(CGit
, StripRefName
)
101 EXPECT_STREQ(_T("abc"), CGit::StripRefName(_T("abc")));
102 EXPECT_STREQ(_T("bcd"), CGit::StripRefName(_T("refs/bcd")));
103 EXPECT_STREQ(_T("cde"), CGit::StripRefName(_T("refs/heads/cde")));
106 TEST(CGit
, CombinePath
)
109 cgit
.m_CurrentDir
= _T("c:\\something");
110 EXPECT_STREQ(_T("c:\\something"), cgit
.CombinePath(_T("")));
111 EXPECT_STREQ(_T("c:\\something\\file.txt"), cgit
.CombinePath(_T("file.txt")));
112 EXPECT_STREQ(_T("c:\\something\\sub\\file.txt"), cgit
.CombinePath(_T("sub\\file.txt")));
113 EXPECT_STREQ(_T("c:\\something\\subdir\\file2.txt"), cgit
.CombinePath(CTGitPath(_T("subdir/file2.txt"))));
116 TEST(CGit
, GetShortName
)
118 CGit::REF_TYPE type
= CGit::UNKNOWN
;
119 EXPECT_STREQ(_T("master"), CGit::GetShortName(_T("refs/heads/master"), &type
));
120 EXPECT_EQ(CGit::LOCAL_BRANCH
, type
);
122 type
= CGit::UNKNOWN
;
123 EXPECT_STREQ(_T("somedir/mastr"), CGit::GetShortName(_T("refs/heads/somedir/mastr"), &type
));
124 EXPECT_EQ(CGit::LOCAL_BRANCH
, type
);
126 type
= CGit::BISECT_BAD
; // do not use UNKNOWN here to make sure it gets set
127 EXPECT_STREQ(_T("svn/something"), CGit::GetShortName(_T("refs/svn/something"), &type
));
128 EXPECT_EQ(CGit::UNKNOWN
, type
);
130 type
= CGit::UNKNOWN
;
131 EXPECT_STREQ(_T("origin/master"), CGit::GetShortName(_T("refs/remotes/origin/master"), &type
));
132 EXPECT_EQ(CGit::REMOTE_BRANCH
, type
);
134 type
= CGit::UNKNOWN
;
135 EXPECT_STREQ(_T("origin/sub/master"), CGit::GetShortName(_T("refs/remotes/origin/sub/master"), &type
));
136 EXPECT_EQ(CGit::REMOTE_BRANCH
, type
);
138 type
= CGit::UNKNOWN
;
139 EXPECT_STREQ(_T("release1"), CGit::GetShortName(_T("refs/tags/release1"), &type
));
140 EXPECT_EQ(CGit::TAG
, type
);
142 type
= CGit::UNKNOWN
;
143 EXPECT_STREQ(_T("releases/v1"), CGit::GetShortName(_T("refs/tags/releases/v1"), &type
));
144 EXPECT_EQ(CGit::TAG
, type
);
146 type
= CGit::UNKNOWN
;
147 EXPECT_STREQ(_T("stash"), CGit::GetShortName(_T("refs/stash"), &type
));
148 EXPECT_EQ(CGit::STASH
, type
);
150 type
= CGit::BISECT_BAD
; // do not use UNKNOWN here to make sure it gets set
151 EXPECT_STREQ(_T("something"), CGit::GetShortName(_T("refs/something"), &type
));
152 EXPECT_EQ(CGit::UNKNOWN
, type
);
154 type
= CGit::BISECT_BAD
; // do not use UNKNOWN here to make sure it gets set
155 EXPECT_STREQ(_T("sth"), CGit::GetShortName(_T("sth"), &type
));
156 EXPECT_EQ(CGit::UNKNOWN
, type
);
158 type
= CGit::UNKNOWN
;
159 EXPECT_STREQ(_T("good"), CGit::GetShortName(_T("refs/bisect/good"), &type
));
160 EXPECT_EQ(CGit::BISECT_GOOD
, type
);
162 type
= CGit::UNKNOWN
;
163 EXPECT_STREQ(_T("good"), CGit::GetShortName(_T("refs/bisect/good-5809ac97a1115a8380b1d6bb304b62cd0b0fa9bb"), &type
));
164 EXPECT_EQ(CGit::BISECT_GOOD
, type
);
166 type
= CGit::UNKNOWN
;
167 EXPECT_STREQ(_T("bad"), CGit::GetShortName(_T("refs/bisect/bad"), &type
));
168 EXPECT_EQ(CGit::BISECT_BAD
, type
);
170 type
= CGit::UNKNOWN
;
171 EXPECT_STREQ(_T("bad"), CGit::GetShortName(_T("refs/bisect/bad-5809ac97a1115a8380b1d6bb304b62cd0b0fd9bb"), &type
));
172 EXPECT_EQ(CGit::BISECT_BAD
, type
);
174 type
= CGit::UNKNOWN
;
175 EXPECT_STREQ(_T("ab"), CGit::GetShortName(_T("refs/notes/ab"), &type
));
176 EXPECT_EQ(CGit::NOTES
, type
);
178 type
= CGit::UNKNOWN
;
179 EXPECT_STREQ(_T("a/b"), CGit::GetShortName(_T("refs/notes/a/b"), &type
));
180 EXPECT_EQ(CGit::NOTES
, type
);
183 TEST(CGit
, GetRepository
)
185 CAutoTempDir tempdir
;
187 cgit
.m_CurrentDir
= tempdir
.GetTempDir();
189 CAutoRepository repo
= cgit
.GetGitRepository();
190 EXPECT_FALSE(repo
.IsValid());
192 cgit
.m_CurrentDir
= tempdir
.GetTempDir() + _T("\\aöäüb");
193 ASSERT_TRUE(CreateDirectory(cgit
.m_CurrentDir
, nullptr));
196 EXPECT_EQ(0, cgit
.Run(_T("git.exe init"), &output
, CP_UTF8
));
197 EXPECT_FALSE(output
.IsEmpty());
199 CAutoRepository repo2
= cgit
.GetGitRepository(); // this tests GetGitRepository as well as m_Git.GetGitPathStringA
200 EXPECT_TRUE(repo2
.IsValid());
202 cgit
.m_CurrentDir
= tempdir
.GetTempDir() + _T("\\aöäüb.git");
203 ASSERT_TRUE(CreateDirectory(cgit
.m_CurrentDir
, nullptr));
206 EXPECT_EQ(0, cgit
.Run(_T("git.exe init --bare"), &output
, CP_UTF8
));
207 EXPECT_FALSE(output
.IsEmpty());
209 CAutoRepository repo3
= cgit
.GetGitRepository(); // this tests GetGitRepository as well as m_Git.GetGitPathStringA
210 EXPECT_TRUE(repo3
.IsValid());
213 TEST_P(CBasicGitWithEmptyRepositoryFixture
, IsInitRepos_GetInitAddList
)
215 EXPECT_STREQ(_T("master"), m_Git
.GetCurrentBranch());
218 CString testFile
= m_Dir
.GetTempDir() + L
"\\test.txt";
220 CTGitPathList addedFiles
;
222 EXPECT_TRUE(m_Git
.IsInitRepos());
223 EXPECT_EQ(0, m_Git
.GetInitAddList(addedFiles
));
224 EXPECT_TRUE(addedFiles
.IsEmpty());
226 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"this is testing file."));
227 EXPECT_EQ(0, m_Git
.GetInitAddList(addedFiles
));
228 EXPECT_TRUE(addedFiles
.IsEmpty());
229 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add test.txt"), &output
, CP_UTF8
));
230 EXPECT_TRUE(output
.IsEmpty());
231 EXPECT_EQ(0, m_Git
.GetInitAddList(addedFiles
));
232 ASSERT_EQ(1, addedFiles
.GetCount());
233 EXPECT_STREQ(_T("test.txt"), addedFiles
[0].GetGitPathString());
236 EXPECT_EQ(0, m_Git
.Run(_T("git.exe commit -m \"Add test.txt\""), &output
, CP_UTF8
));
237 EXPECT_FALSE(output
.IsEmpty());
239 EXPECT_FALSE(m_Git
.IsInitRepos());
241 EXPECT_STREQ(_T("master"), m_Git
.GetCurrentBranch());
244 TEST_P(CBasicGitWithTestRepoFixture
, IsInitRepos
)
246 EXPECT_FALSE(m_Git
.IsInitRepos());
249 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout --orphan orphanic"), &output
, CP_UTF8
));
250 EXPECT_FALSE(output
.IsEmpty());
252 EXPECT_TRUE(m_Git
.IsInitRepos());
255 TEST_P(CBasicGitWithTestRepoFixture
, HasWorkingTreeConflicts
)
258 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
259 EXPECT_FALSE(output
.IsEmpty());
261 EXPECT_EQ(FALSE
, m_Git
.HasWorkingTreeConflicts());
264 EXPECT_EQ(0, m_Git
.Run(_T("git.exe merge forconflict"), &output
, CP_UTF8
));
265 EXPECT_FALSE(output
.IsEmpty());
266 EXPECT_EQ(FALSE
, m_Git
.HasWorkingTreeConflicts());
269 EXPECT_EQ(1, m_Git
.Run(_T("git.exe merge simple-conflict"), &output
, CP_UTF8
));
270 EXPECT_FALSE(output
.IsEmpty());
271 EXPECT_EQ(TRUE
, m_Git
.HasWorkingTreeConflicts());
274 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
275 EXPECT_FALSE(output
.IsEmpty());
278 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout forconflict"), &output
, CP_UTF8
));
279 EXPECT_FALSE(output
.IsEmpty());
282 EXPECT_EQ(1, m_Git
.Run(_T("git.exe merge simple-conflict"), &output
, CP_UTF8
));
283 EXPECT_FALSE(output
.IsEmpty());
284 EXPECT_EQ(TRUE
, m_Git
.HasWorkingTreeConflicts());
287 TEST_P(CBasicGitWithTestRepoFixture
, GetCurrentBranch
)
289 EXPECT_STREQ(_T("master"), m_Git
.GetCurrentBranch());
290 EXPECT_STREQ(_T("master"), m_Git
.GetCurrentBranch(true));
293 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout simple-conflict"), &output
, CP_UTF8
));
294 EXPECT_STREQ(_T("simple-conflict"), m_Git
.GetCurrentBranch());
295 EXPECT_STREQ(_T("simple-conflict"), m_Git
.GetCurrentBranch(true));
297 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout subdir/branch"), &output
, CP_UTF8
));
298 EXPECT_STREQ(_T("subdir/branch"), m_Git
.GetCurrentBranch());
299 EXPECT_STREQ(_T("subdir/branch"), m_Git
.GetCurrentBranch(true));
301 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout 560deea87853158b22d0c0fd73f60a458d47838a"), &output
, CP_UTF8
));
302 EXPECT_STREQ(_T("(no branch)"), m_Git
.GetCurrentBranch());
303 EXPECT_STREQ(_T("560deea87853158b22d0c0fd73f60a458d47838a"), m_Git
.GetCurrentBranch(true));
306 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout --orphan orphanic"), &output
, CP_UTF8
));
307 EXPECT_FALSE(output
.IsEmpty());
309 EXPECT_STREQ(_T("orphanic"), m_Git
.GetCurrentBranch());
310 EXPECT_STREQ(_T("orphanic"), m_Git
.GetCurrentBranch(true));
313 TEST_P(CBasicGitWithTestRepoBareFixture
, GetCurrentBranch
)
315 EXPECT_STREQ(_T("master"), m_Git
.GetCurrentBranch());
316 EXPECT_STREQ(_T("master"), m_Git
.GetCurrentBranch(true));
319 static void BranchTagExists_IsBranchTagNameUnique(CGit
& m_Git
)
321 EXPECT_TRUE(m_Git
.BranchTagExists(_T("master"), true));
322 EXPECT_FALSE(m_Git
.BranchTagExists(_T("origin/master"), true));
323 EXPECT_FALSE(m_Git
.BranchTagExists(_T("normal-tag"), true));
324 EXPECT_FALSE(m_Git
.BranchTagExists(_T("also-signed"), true));
325 EXPECT_FALSE(m_Git
.BranchTagExists(_T("wuseldusel"), true));
327 EXPECT_FALSE(m_Git
.BranchTagExists(_T("master"), false));
328 EXPECT_TRUE(m_Git
.BranchTagExists(_T("normal-tag"), false));
329 EXPECT_TRUE(m_Git
.BranchTagExists(_T("also-signed"), false));
330 EXPECT_FALSE(m_Git
.BranchTagExists(_T("wuseldusel"), false));
332 EXPECT_TRUE(m_Git
.IsBranchTagNameUnique(_T("master")));
333 EXPECT_TRUE(m_Git
.IsBranchTagNameUnique(_T("simpleconflict")));
334 EXPECT_TRUE(m_Git
.IsBranchTagNameUnique(_T("normal-tag")));
335 EXPECT_TRUE(m_Git
.IsBranchTagNameUnique(_T("also-signed")));
336 EXPECT_TRUE(m_Git
.IsBranchTagNameUnique(_T("origin/master")));
339 EXPECT_EQ(0, m_Git
.Run(_T("git.exe tag master HEAD~2"), &output
, CP_UTF8
));
340 EXPECT_TRUE(output
.IsEmpty());
342 EXPECT_EQ(0, m_Git
.Run(_T("git.exe branch normal-tag HEAD~2"), &output
, CP_UTF8
));
343 EXPECT_TRUE(output
.IsEmpty());
345 EXPECT_FALSE(m_Git
.IsBranchTagNameUnique(_T("master")));
346 EXPECT_FALSE(m_Git
.IsBranchTagNameUnique(_T("normal-tag")));
347 EXPECT_TRUE(m_Git
.IsBranchTagNameUnique(_T("also-signed")));
350 TEST_P(CBasicGitWithTestRepoFixture
, BranchTagExists_IsBranchTagNameUnique
)
352 BranchTagExists_IsBranchTagNameUnique(m_Git
);
355 TEST_P(CBasicGitWithTestRepoBareFixture
, BranchTagExists_IsBranchTagNameUnique
)
357 BranchTagExists_IsBranchTagNameUnique(m_Git
);
360 static void GetFullRefName(CGit
& m_Git
)
362 EXPECT_STREQ(_T(""), m_Git
.GetFullRefName(_T("does_not_exist")));
363 EXPECT_STREQ(_T("refs/heads/master"), m_Git
.GetFullRefName(_T("master")));
364 EXPECT_STREQ(_T("refs/remotes/origin/master"), m_Git
.GetFullRefName(_T("origin/master")));
365 EXPECT_STREQ(_T("refs/tags/normal-tag"), m_Git
.GetFullRefName(_T("normal-tag")));
366 EXPECT_STREQ(_T("refs/tags/also-signed"), m_Git
.GetFullRefName(_T("also-signed")));
369 EXPECT_EQ(0, m_Git
.Run(_T("git.exe tag master HEAD~2"), &output
, CP_UTF8
));
370 EXPECT_TRUE(output
.IsEmpty());
371 EXPECT_STREQ(_T(""), m_Git
.GetFullRefName(_T("master")));
372 EXPECT_STREQ(_T("refs/remotes/origin/master"), m_Git
.GetFullRefName(_T("origin/master")));
374 EXPECT_EQ(0, m_Git
.Run(_T("git.exe branch normal-tag HEAD~2"), &output
, CP_UTF8
));
375 EXPECT_TRUE(output
.IsEmpty());
376 EXPECT_STREQ(_T(""), m_Git
.GetFullRefName(_T("normal-tag")));
378 EXPECT_EQ(0, m_Git
.Run(_T("git.exe branch origin/master HEAD~2"), &output
, CP_UTF8
));
379 EXPECT_TRUE(output
.IsEmpty());
380 EXPECT_STREQ(_T(""), m_Git
.GetFullRefName(_T("origin/master")));
383 TEST_P(CBasicGitWithTestRepoFixture
, GetFullRefName
)
385 GetFullRefName(m_Git
);
388 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout --orphan orphanic"), &output
, CP_UTF8
));
389 EXPECT_FALSE(output
.IsEmpty());
390 EXPECT_STREQ(_T(""), m_Git
.GetFullRefName(_T("orphanic")));
393 TEST_P(CBasicGitWithTestRepoBareFixture
, GetFullRefName
)
395 GetFullRefName(m_Git
);
398 TEST_P(CBasicGitWithEmptyRepositoryFixture
, GetRemoteTrackedBranch
)
400 CString remote
, branch
;
401 m_Git
.GetRemoteTrackedBranchForHEAD(remote
, branch
);
402 EXPECT_TRUE(remote
.IsEmpty());
403 EXPECT_TRUE(branch
.IsEmpty());
405 m_Git
.GetRemoteTrackedBranch(_T("master"), remote
, branch
);
406 EXPECT_TRUE(remote
.IsEmpty());
407 EXPECT_TRUE(branch
.IsEmpty());
409 m_Git
.GetRemoteTrackedBranch(_T("non-existing"), remote
, branch
);
410 EXPECT_TRUE(remote
.IsEmpty());
411 EXPECT_TRUE(branch
.IsEmpty());
414 static void GetRemoteTrackedBranch(CGit
& m_Git
)
416 CString remote
, branch
;
417 m_Git
.GetRemoteTrackedBranchForHEAD(remote
, branch
);
418 EXPECT_STREQ(_T("origin"), remote
);
419 EXPECT_STREQ(_T("master"), branch
);
423 m_Git
.GetRemoteTrackedBranch(_T("master"), remote
, branch
);
424 EXPECT_STREQ(_T("origin"), remote
);
425 EXPECT_STREQ(_T("master"), branch
);
429 m_Git
.GetRemoteTrackedBranch(_T("non-existing"), remote
, branch
);
430 EXPECT_TRUE(remote
.IsEmpty());
431 EXPECT_TRUE(branch
.IsEmpty());
434 TEST_P(CBasicGitWithTestRepoFixture
, GetRemoteTrackedBranch
)
436 GetRemoteTrackedBranch(m_Git
);
439 TEST_P(CBasicGitWithTestRepoBareFixture
, GetRemoteTrackedBranch
)
441 GetRemoteTrackedBranch(m_Git
);
444 static void CanParseRev(CGit
& m_Git
)
446 EXPECT_TRUE(m_Git
.CanParseRev(_T("")));
447 EXPECT_TRUE(m_Git
.CanParseRev(_T("HEAD")));
448 EXPECT_TRUE(m_Git
.CanParseRev(_T("master")));
449 EXPECT_TRUE(m_Git
.CanParseRev(_T("heads/master")));
450 EXPECT_TRUE(m_Git
.CanParseRev(_T("refs/heads/master")));
451 EXPECT_TRUE(m_Git
.CanParseRev(_T("master~1")));
452 EXPECT_TRUE(m_Git
.CanParseRev(_T("master forconflict")));
453 EXPECT_TRUE(m_Git
.CanParseRev(_T("origin/master..master")));
454 EXPECT_TRUE(m_Git
.CanParseRev(_T("origin/master...master")));
455 EXPECT_TRUE(m_Git
.CanParseRev(_T("49ecdfff36bfe2b9b499b33e5034f427e2fa54dd")));
456 EXPECT_FALSE(m_Git
.CanParseRev(_T("non-existing")));
457 EXPECT_TRUE(m_Git
.CanParseRev(_T("normal-tag")));
458 EXPECT_TRUE(m_Git
.CanParseRev(_T("tags/normal-tag")));
459 EXPECT_TRUE(m_Git
.CanParseRev(_T("refs/tags/normal-tag")));
460 EXPECT_TRUE(m_Git
.CanParseRev(_T("all-files-signed")));
461 EXPECT_TRUE(m_Git
.CanParseRev(_T("all-files-signed^{}")));
463 EXPECT_FALSE(m_Git
.CanParseRev(_T("orphanic")));
466 TEST_P(CBasicGitWithTestRepoFixture
, CanParseRev
)
471 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout --orphan orphanic"), &output
, CP_UTF8
));
472 EXPECT_FALSE(output
.IsEmpty());
473 EXPECT_FALSE(m_Git
.CanParseRev(_T("")));
474 EXPECT_FALSE(m_Git
.CanParseRev(_T("HEAD")));
475 EXPECT_FALSE(m_Git
.CanParseRev(_T("orphanic")));
476 EXPECT_TRUE(m_Git
.CanParseRev(_T("master")));
479 TEST_P(CBasicGitWithTestRepoBareFixture
, CanParseRev
)
484 static void FETCHHEAD(CGit
& m_Git
, bool isBare
)
486 CString repoDir
= m_Git
.m_CurrentDir
;
488 repoDir
+= _T("\\.git");
491 EXPECT_EQ(0, m_Git
.GetBranchList(list
, nullptr));
492 EXPECT_EQ(5, list
.size());
494 EXPECT_EQ(0, m_Git
.GetBranchList(list
, nullptr, CGit::BRANCH_LOCAL_F
));
495 EXPECT_EQ(5, list
.size());
497 EXPECT_STREQ(_T("HEAD"), m_Git
.FixBranchName(_T("HEAD")));
498 EXPECT_STREQ(_T("master"), m_Git
.FixBranchName(_T("master")));
499 EXPECT_STREQ(_T("non-existing"), m_Git
.FixBranchName(_T("non-existing")));
500 CString branch
= _T("master");
501 EXPECT_STREQ(_T("master"), m_Git
.FixBranchName_Mod(branch
));
502 EXPECT_STREQ(_T("master"), branch
);
503 branch
= _T("non-existing");
504 EXPECT_STREQ(_T("non-existing"), m_Git
.FixBranchName_Mod(branch
));
505 EXPECT_STREQ(_T("non-existing"), branch
);
507 EXPECT_NE(0, m_Git
.GetHash(hash
, _T("FETCH_HEAD")));
509 CString testFile
= repoDir
+ L
"\\FETCH_HEAD";
510 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"b9ef30183497cdad5c30b88d32dc1bed7951dfeb branch 'master' of https://code.google.com/p/tortoisegit\n737878a4e2eabfa4fab580867c2b060c70999d31 not-for-merge branch 'extend_hooks' of https://code.google.com/p/tortoisegit\n"));
513 EXPECT_EQ(0, m_Git
.GetBranchList(list
, nullptr));
514 EXPECT_EQ(5, list
.size());
516 EXPECT_EQ(0, m_Git
.GetBranchList(list
, nullptr, CGit::BRANCH_LOCAL_F
));
517 EXPECT_EQ(6, list
.size());
519 EXPECT_STREQ(_T("master"), m_Git
.FixBranchName(_T("master")));
520 EXPECT_STREQ(_T("non-existing"), m_Git
.FixBranchName(_T("non-existing")));
521 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), m_Git
.FixBranchName(_T("FETCH_HEAD")));
523 EXPECT_STREQ(_T("HEAD"), m_Git
.FixBranchName_Mod(branch
));
524 EXPECT_STREQ(_T("HEAD"), branch
);
525 branch
= _T("master");
526 EXPECT_STREQ(_T("master"), m_Git
.FixBranchName_Mod(branch
));
527 EXPECT_STREQ(_T("master"), branch
);
528 branch
= _T("non-existing");
529 EXPECT_STREQ(_T("non-existing"), m_Git
.FixBranchName_Mod(branch
));
530 EXPECT_STREQ(_T("non-existing"), branch
);
531 branch
= _T("FETCH_HEAD");
532 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), m_Git
.FixBranchName_Mod(branch
));
533 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), branch
);
534 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("FETCH_HEAD")));
535 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), hash
.ToString());
537 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"737878a4e2eabfa4fab580867c2b060c70999d31 not-for-merge branch 'extend_hooks' of https://code.google.com/p/tortoisegit\nb9ef30183497cdad5c30b88d32dc1bed7951dfeb branch 'master' of https://code.google.com/p/tortoisegit\n"));
540 EXPECT_EQ(0, m_Git
.GetBranchList(list
, nullptr));
541 EXPECT_EQ(5, list
.size());
543 EXPECT_EQ(0, m_Git
.GetBranchList(list
, nullptr, CGit::BRANCH_LOCAL_F
));
544 EXPECT_EQ(6, list
.size());
546 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), m_Git
.FixBranchName(_T("FETCH_HEAD")));
547 branch
= _T("FETCH_HEAD");
548 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), m_Git
.FixBranchName_Mod(branch
));
549 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), branch
);
550 // libgit2 fails here
551 //EXPECT_EQ(0, m_Git.GetHash(hash, _T("FETCH_HEAD")));
552 //EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), hash.ToString());
555 TEST_P(CBasicGitWithTestRepoFixture
, FETCHHEAD
)
557 FETCHHEAD(m_Git
, false);
560 TEST_P(CBasicGitWithTestRepoBareFixture
, FETCHHEAD
)
562 FETCHHEAD(m_Git
, true);
565 TEST_P(CBasicGitWithTestRepoFixture
, IsFastForward
)
567 CGitHash commonAncestor
;
568 EXPECT_TRUE(m_Git
.IsFastForward(_T("origin/master"), _T("master"), &commonAncestor
));
569 EXPECT_STREQ(_T("a9d53b535cb49640a6099860ac4999f5a0857b91"), commonAncestor
.ToString());
571 EXPECT_FALSE(m_Git
.IsFastForward(_T("simple-conflict"), _T("master"), &commonAncestor
));
572 EXPECT_STREQ(_T("b02add66f48814a73aa2f0876d6bbc8662d6a9a8"), commonAncestor
.ToString());
575 static void GetHash(CGit
& m_Git
)
578 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("HEAD")));
579 EXPECT_STREQ(_T("7c3cbfe13a929d2291a574dca45e4fd2d2ac1aa6"), hash
.ToString());
580 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("HEAD~1")));
581 EXPECT_STREQ(_T("1fc3c9688e27596d8717b54f2939dc951568f6cb"), hash
.ToString());
582 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("ff1fbef1a54a9849afd4a5e94d2ca4d80d5b96c2")));
583 EXPECT_STREQ(_T("ff1fbef1a54a9849afd4a5e94d2ca4d80d5b96c2"), hash
.ToString());
584 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("master")));
585 EXPECT_STREQ(_T("7c3cbfe13a929d2291a574dca45e4fd2d2ac1aa6"), hash
.ToString());
586 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("origin/master")));
587 EXPECT_STREQ(_T("a9d53b535cb49640a6099860ac4999f5a0857b91"), hash
.ToString());
588 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("49ecdfff36bfe2b9b499b33e5034f427e2fa54dd")));
589 EXPECT_STREQ(_T("49ecdfff36bfe2b9b499b33e5034f427e2fa54dd"), hash
.ToString());
590 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("normal-tag")));
591 EXPECT_STREQ(_T("b9ef30183497cdad5c30b88d32dc1bed7951dfeb"), hash
.ToString());
592 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("all-files-signed")));
593 EXPECT_STREQ(_T("ab555b2776c6b700ad93848d0dd050e7d08be779"), hash
.ToString()); // maybe we need automatically to dereference it
594 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("all-files-signed^{}")));
595 EXPECT_STREQ(_T("313a41bc88a527289c87d7531802ab484715974f"), hash
.ToString());
597 EXPECT_NE(0, m_Git
.GetHash(hash
, _T("non-existing")));
600 TEST_P(CBasicGitWithTestRepoFixture
, GetHash
)
605 TEST_P(CBasicGitWithTestRepoBareFixture
, GetHash
)
610 TEST_P(CBasicGitWithEmptyRepositoryFixture
, GetHash_EmptyRepo
)
613 EXPECT_EQ(0, m_Git
.GetHash(hash
, _T("HEAD")));
614 EXPECT_TRUE(hash
.IsEmpty());
617 TEST_P(CBasicGitWithEmptyRepositoryFixture
, GetEmptyBranchesTagsRefs
)
619 STRING_VECTOR branches
;
621 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
));
622 EXPECT_TRUE(branches
.empty());
623 EXPECT_EQ(-2, current
); // not touched
625 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
, CGit::BRANCH_ALL
));
626 EXPECT_TRUE(branches
.empty());
627 EXPECT_EQ(-2, current
); // not touched
630 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
631 EXPECT_TRUE(tags
.empty());
634 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
635 EXPECT_TRUE(refs
.empty());
638 EXPECT_EQ(0, m_Git
.GetMapHashToFriendName(map
));
639 EXPECT_TRUE(map
.empty());
641 STRING_VECTOR remotes
;
642 EXPECT_EQ(0, m_Git
.GetRemoteList(remotes
));
643 EXPECT_TRUE(remotes
.empty());
646 static void GetBranchesTagsRefs(CGit
& m_Git
, config testConfig
)
648 STRING_VECTOR branches
;
650 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
));
651 ASSERT_EQ(5, branches
.size());
652 EXPECT_EQ(1, current
);
653 EXPECT_STREQ(_T("forconflict"), branches
[0]);
654 EXPECT_STREQ(_T("master"), branches
[1]);
655 EXPECT_STREQ(_T("master2"), branches
[2]);
656 EXPECT_STREQ(_T("simple-conflict"), branches
[3]);
657 EXPECT_STREQ(_T("subdir/branch"), branches
[4]);
661 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
, CGit::BRANCH_ALL
));
662 ASSERT_EQ(6, branches
.size());
663 EXPECT_EQ(1, current
);
664 EXPECT_STREQ(_T("forconflict"), branches
[0]);
665 EXPECT_STREQ(_T("master"), branches
[1]);
666 EXPECT_STREQ(_T("master2"), branches
[2]);
667 EXPECT_STREQ(_T("simple-conflict"), branches
[3]);
668 EXPECT_STREQ(_T("subdir/branch"), branches
[4]);
669 EXPECT_STREQ(_T("remotes/origin/master"), branches
[5]);
673 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
, CGit::BRANCH_REMOTE
));
674 ASSERT_EQ(1, branches
.size());
675 EXPECT_EQ(-2, current
); // not touched
676 EXPECT_STREQ(_T("remotes/origin/master"), branches
[0]);
679 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
680 ASSERT_EQ(3, tags
.size());
681 EXPECT_STREQ(_T("all-files-signed"), tags
[0]);
682 EXPECT_STREQ(_T("also-signed"), tags
[1]);
683 EXPECT_STREQ(_T("normal-tag"), tags
[2]);
686 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
687 ASSERT_EQ(11, refs
.size());
688 EXPECT_STREQ(_T("refs/heads/forconflict"), refs
[0]);
689 EXPECT_STREQ(_T("refs/heads/master"), refs
[1]);
690 EXPECT_STREQ(_T("refs/heads/master2"), refs
[2]);
691 EXPECT_STREQ(_T("refs/heads/simple-conflict"), refs
[3]);
692 EXPECT_STREQ(_T("refs/heads/subdir/branch"), refs
[4]);
693 EXPECT_STREQ(_T("refs/notes/commits"), refs
[5]);
694 EXPECT_STREQ(_T("refs/remotes/origin/master"), refs
[6]);
695 EXPECT_STREQ(_T("refs/stash"), refs
[7]);
696 EXPECT_STREQ(_T("refs/tags/all-files-signed"), refs
[8]);
697 EXPECT_STREQ(_T("refs/tags/also-signed"), refs
[9]);
698 EXPECT_STREQ(_T("refs/tags/normal-tag"), refs
[10]);
701 EXPECT_EQ(0, m_Git
.GetMapHashToFriendName(map
));
702 if (testConfig
== GIT_CLI
|| testConfig
== LIBGIT
)
703 ASSERT_EQ(12, map
.size()); // also contains the undereferenced tags with hashes
705 ASSERT_EQ(10, map
.size());
707 ASSERT_EQ(1, map
[CGitHash(L
"7c3cbfe13a929d2291a574dca45e4fd2d2ac1aa6")].size());
708 EXPECT_STREQ(_T("refs/heads/master"), map
[CGitHash(L
"7c3cbfe13a929d2291a574dca45e4fd2d2ac1aa6")][0]);
709 ASSERT_EQ(1, map
[CGitHash(L
"4c5c93d2a0b368bc4570d5ec02ab03b9c4334d44")].size());
710 EXPECT_STREQ(_T("refs/heads/subdir/branch"), map
[CGitHash(L
"4c5c93d2a0b368bc4570d5ec02ab03b9c4334d44")][0]);
711 ASSERT_EQ(1, map
[CGitHash(L
"5e702e1712aa6f8cd8e0328a87be006f3a923710")].size());
712 EXPECT_STREQ(_T("refs/notes/commits"), map
[CGitHash(L
"5e702e1712aa6f8cd8e0328a87be006f3a923710")][0]);
713 ASSERT_EQ(1, map
[CGitHash(L
"18da7c332dcad0f37f9977d9176dce0b0c66f3eb")].size());
714 EXPECT_STREQ(_T("refs/stash"), map
[CGitHash(L
"18da7c332dcad0f37f9977d9176dce0b0c66f3eb")][0]);
715 ASSERT_EQ(1, map
[CGitHash(L
"c5b89de0335fd674e2e421ac4543098cb2f22cde")].size());
716 EXPECT_STREQ(_T("refs/heads/simple-conflict"), map
[CGitHash(L
"c5b89de0335fd674e2e421ac4543098cb2f22cde")][0]);
717 ASSERT_EQ(1, map
[CGitHash(L
"10385764a4d42d7428bbeb245015f8f338fc1e40")].size());
718 EXPECT_STREQ(_T("refs/heads/forconflict"), map
[CGitHash(L
"10385764a4d42d7428bbeb245015f8f338fc1e40")][0]);
719 ASSERT_EQ(2, map
[CGitHash(L
"49ecdfff36bfe2b9b499b33e5034f427e2fa54dd")].size());
720 EXPECT_STREQ(_T("refs/heads/master2"), map
[CGitHash(L
"49ecdfff36bfe2b9b499b33e5034f427e2fa54dd")][0]);
721 EXPECT_STREQ(_T("refs/tags/also-signed^{}"), map
[CGitHash(L
"49ecdfff36bfe2b9b499b33e5034f427e2fa54dd")][1]);
722 ASSERT_EQ(1, map
[CGitHash(L
"b9ef30183497cdad5c30b88d32dc1bed7951dfeb")].size());//
723 EXPECT_STREQ(_T("refs/tags/normal-tag"), map
[CGitHash(L
"b9ef30183497cdad5c30b88d32dc1bed7951dfeb")][0]);
724 ASSERT_EQ(1, map
[CGitHash(L
"a9d53b535cb49640a6099860ac4999f5a0857b91")].size());
725 EXPECT_STREQ(_T("refs/remotes/origin/master"), map
[CGitHash(L
"a9d53b535cb49640a6099860ac4999f5a0857b91")][0]);
726 ASSERT_EQ(1, map
[CGitHash(L
"313a41bc88a527289c87d7531802ab484715974f")].size());
727 EXPECT_STREQ(_T("refs/tags/all-files-signed^{}"), map
[CGitHash(L
"313a41bc88a527289c87d7531802ab484715974f")][0]);
729 STRING_VECTOR remotes
;
730 EXPECT_EQ(0, m_Git
.GetRemoteList(remotes
));
731 ASSERT_EQ(1, remotes
.size());
732 EXPECT_STREQ(_T("origin"), remotes
[0]);
734 EXPECT_EQ(-1, m_Git
.DeleteRef(_T("refs/tags/gibbednet")));
736 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, nullptr, CGit::BRANCH_ALL
));
737 EXPECT_EQ(6, branches
.size());
739 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
740 EXPECT_EQ(3, tags
.size());
742 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
743 EXPECT_EQ(11, refs
.size());
745 EXPECT_EQ(-1, m_Git
.DeleteRef(_T("refs/heads/gibbednet")));
747 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, nullptr, CGit::BRANCH_ALL
));
748 EXPECT_EQ(6, branches
.size());
750 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
751 EXPECT_EQ(3, tags
.size());
753 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
754 EXPECT_EQ(11, refs
.size());
756 EXPECT_EQ(-1, m_Git
.DeleteRef(_T("refs/remotes/origin/gibbednet")));
758 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, nullptr, CGit::BRANCH_ALL
));
759 EXPECT_EQ(6, branches
.size());
761 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
762 EXPECT_EQ(3, tags
.size());
764 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
765 EXPECT_EQ(11, refs
.size());
767 EXPECT_EQ(0, m_Git
.DeleteRef(_T("refs/tags/normal-tag")));
769 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, nullptr, CGit::BRANCH_ALL
));
770 EXPECT_EQ(6, branches
.size());
772 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
773 EXPECT_EQ(2, tags
.size());
775 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
776 EXPECT_EQ(10, refs
.size());
778 EXPECT_EQ(0, m_Git
.DeleteRef(_T("refs/tags/all-files-signed^{}")));
780 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, nullptr, CGit::BRANCH_ALL
));
781 EXPECT_EQ(6, branches
.size());
783 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
784 EXPECT_EQ(1, tags
.size());
786 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
787 EXPECT_EQ(9, refs
.size());
789 EXPECT_EQ(0, m_Git
.DeleteRef(_T("refs/heads/subdir/branch")));
791 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, nullptr, CGit::BRANCH_ALL
));
792 EXPECT_EQ(5, branches
.size());
794 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
795 EXPECT_EQ(1, tags
.size());
797 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
798 EXPECT_EQ(8, refs
.size());
800 EXPECT_EQ(0, m_Git
.DeleteRef(_T("refs/remotes/origin/master")));
802 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, nullptr, CGit::BRANCH_ALL
));
803 EXPECT_EQ(4, branches
.size());
805 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
806 EXPECT_EQ(1, tags
.size());
808 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
809 EXPECT_EQ(7, refs
.size());
812 TEST_P(CBasicGitWithTestRepoFixture
, GetBranchesTagsRefs
)
814 GetBranchesTagsRefs(m_Git
, GetParam());
817 TEST_P(CBasicGitWithTestRepoBareFixture
, GetBranchesTagsRefs
)
819 GetBranchesTagsRefs(m_Git
, GetParam());
822 TEST_P(CBasicGitWithTestRepoFixture
, GetBranchList_orphan
)
825 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout --orphan orphanic"), &output
, CP_UTF8
));
826 EXPECT_FALSE(output
.IsEmpty());
828 STRING_VECTOR branches
;
830 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
));
831 ASSERT_EQ(5, branches
.size());
832 EXPECT_EQ(-2, current
);
833 EXPECT_STREQ(_T("forconflict"), branches
[0]);
834 EXPECT_STREQ(_T("master"), branches
[1]);
835 EXPECT_STREQ(_T("master2"), branches
[2]);
836 EXPECT_STREQ(_T("simple-conflict"), branches
[3]);
837 EXPECT_STREQ(_T("subdir/branch"), branches
[4]);
840 TEST_P(CBasicGitWithEmptyBareRepositoryFixture
, GetEmptyBranchesTagsRefs
)
842 EXPECT_STREQ(_T("master"), m_Git
.GetCurrentBranch());
844 STRING_VECTOR branches
;
846 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
));
847 EXPECT_TRUE(branches
.empty());
848 EXPECT_EQ(-2, current
); // not touched
850 EXPECT_EQ(0, m_Git
.GetBranchList(branches
, ¤t
, CGit::BRANCH_ALL
));
851 EXPECT_TRUE(branches
.empty());
852 EXPECT_EQ(-2, current
); // not touched
855 EXPECT_EQ(0, m_Git
.GetTagList(tags
));
856 EXPECT_TRUE(tags
.empty());
859 EXPECT_EQ(0, m_Git
.GetRefList(refs
));
860 EXPECT_TRUE(refs
.empty());
863 EXPECT_EQ(0, m_Git
.GetMapHashToFriendName(map
));
864 EXPECT_TRUE(map
.empty());
866 STRING_VECTOR remotes
;
867 EXPECT_EQ(0, m_Git
.GetRemoteList(remotes
));
868 EXPECT_TRUE(remotes
.empty());
871 TEST_P(CBasicGitWithEmptyRepositoryFixture
, CheckCleanWorkTree
)
874 CString testFile
= m_Dir
.GetTempDir() + L
"\\test.txt";
875 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"this is testing file."));
876 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add test.txt"), &output
, CP_UTF8
));
878 EXPECT_EQ(0, m_Git
.Run(_T("git.exe commit -m \"Add test.txt\""), &output
, CP_UTF8
));
879 // repo with 1 versioned file
880 EXPECT_FALSE(output
.IsEmpty());
881 EXPECT_TRUE(m_Git
.CheckCleanWorkTree());
882 EXPECT_TRUE(m_Git
.CheckCleanWorkTree(true));
884 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"Overwriting this testing file."));
885 // repo with 1 modified versioned file
886 EXPECT_FALSE(m_Git
.CheckCleanWorkTree());
887 EXPECT_FALSE(m_Git
.CheckCleanWorkTree(true));
890 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add test.txt"), &output
, CP_UTF8
));
891 // repo with 1 modified versioned and staged file
892 EXPECT_TRUE(output
.IsEmpty());
893 EXPECT_FALSE(m_Git
.CheckCleanWorkTree());
894 EXPECT_TRUE(m_Git
.CheckCleanWorkTree(true));
896 EXPECT_EQ(0, m_Git
.Run(_T("git.exe commit -m \"Modified test.txt\""), &output
, CP_UTF8
));
897 testFile
= m_Dir
.GetTempDir() + L
"\\test2.txt";
898 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"this is ANOTHER testing file."));
899 EXPECT_TRUE(m_Git
.CheckCleanWorkTree());
900 EXPECT_TRUE(m_Git
.CheckCleanWorkTree(true));
902 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout --orphan orphanic"), &output
, CP_UTF8
));
903 EXPECT_FALSE(output
.IsEmpty());
904 EXPECT_FALSE(m_Git
.CheckCleanWorkTree());
905 EXPECT_FALSE(m_Git
.CheckCleanWorkTree(true));
908 TEST(CGit
, CEnvironment
)
911 EXPECT_TRUE(env
.empty());
912 env
.SetEnv(_T("not-found"), nullptr);
913 EXPECT_STREQ(_T(""), env
.GetEnv(L
"test"));
914 env
.SetEnv(L
"key1", L
"value1");
915 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
916 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"kEy1")); // check case insensitivity
917 EXPECT_FALSE(env
.empty());
918 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
919 env
.SetEnv(L
"key1", nullptr); // delete first
920 EXPECT_TRUE(env
.empty());
921 env
.SetEnv(L
"key1", L
"value1");
922 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
923 env
.SetEnv(L
"key2", L
"value2");
924 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
925 EXPECT_STREQ(_T("value2"), env
.GetEnv(L
"key2"));
926 env
.SetEnv(_T("not-found"), nullptr);
927 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
928 EXPECT_STREQ(_T("value2"), env
.GetEnv(L
"key2"));
929 env
.SetEnv(_T("key2"), nullptr); // delete last
930 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
931 EXPECT_STREQ(_T(""), env
.GetEnv(L
"key2"));
932 env
.SetEnv(L
"key3", L
"value3");
933 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
934 EXPECT_STREQ(_T("value3"), env
.GetEnv(L
"key3"));
935 env
.SetEnv(L
"key4", L
"value4");
936 env
.SetEnv(_T("value3"), nullptr); // delete middle
937 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
938 EXPECT_STREQ(_T("value4"), env
.GetEnv(L
"key4"));
939 env
.SetEnv(L
"key5", L
"value5");
940 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
941 EXPECT_STREQ(_T("value4"), env
.GetEnv(L
"key4"));
942 EXPECT_STREQ(_T("value5"), env
.GetEnv(L
"key5"));
943 env
.SetEnv(L
"key4", L
"value4a");
944 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
945 EXPECT_STREQ(_T("value4a"), env
.GetEnv(L
"key4"));
946 EXPECT_STREQ(_T("value5"), env
.GetEnv(L
"key5"));
947 env
.SetEnv(L
"key5", L
"value5a");
948 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
949 EXPECT_STREQ(_T("value4a"), env
.GetEnv(L
"key4"));
950 EXPECT_STREQ(_T("value5a"), env
.GetEnv(L
"key5"));
951 CString windir
= _wgetenv(L
"windir");
952 env
.CopyProcessEnvironment();
953 EXPECT_STREQ(windir
, env
.GetEnv(L
"windir"));
954 EXPECT_STREQ(_T("value1"), env
.GetEnv(L
"key1"));
955 EXPECT_STREQ(_T("value4a"), env
.GetEnv(L
"key4"));
956 EXPECT_STREQ(_T("value5a"), env
.GetEnv(L
"key5"));
958 EXPECT_TRUE(env
.empty());
959 EXPECT_STREQ(_T(""), env
.GetEnv(L
"key4"));
960 env
.CopyProcessEnvironment();
961 EXPECT_STREQ(windir
, env
.GetEnv(L
"windir"));
964 CString path
= L
"c:\\windows;c:\\windows\\system32";
965 env
.SetEnv(L
"PATH", path
);
967 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
968 env
.AddToPath(L
"c:\\windows");
969 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
970 env
.AddToPath(L
"c:\\windows\\");
971 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
972 env
.AddToPath(L
"c:\\windows\\system32");
973 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
974 env
.AddToPath(L
"c:\\windows\\system32\\");
975 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
976 path
+= L
";c:\\windows\\system";
977 env
.AddToPath(L
"c:\\windows\\system");
978 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
979 path
+= L
";c:\\test";
980 env
.AddToPath(L
"c:\\test\\");
981 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
982 env
.AddToPath(L
"c:\\test\\");
983 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
984 env
.AddToPath(L
"c:\\test");
985 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
986 path
= L
"c:\\windows;c:\\windows\\system32;";
987 env
.SetEnv(L
"PATH", path
);
989 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
990 env
.AddToPath(L
"c:\\test");
992 EXPECT_STREQ(path
, env
.GetEnv(L
"PATH"));
995 static void GetOneFile(CGit
& m_Git
)
997 CString tmpFile
= GetTempFile();
998 EXPECT_EQ(0, m_Git
.GetOneFile(L
"b9ef30183497cdad5c30b88d32dc1bed7951dfeb", CTGitPath(L
"utf8-nobom.txt"), tmpFile
));
999 CString fileContents
;
1000 EXPECT_EQ(true, CStringUtils::ReadStringFromTextFile(tmpFile
, fileContents
));
1001 struct _stat32 stat_buf
= { 0 };
1002 EXPECT_EQ(0, _wstat32(tmpFile
, &stat_buf
));
1003 EXPECT_EQ(139, stat_buf
.st_size
);
1004 EXPECT_EQ(108, fileContents
.GetLength());
1005 EXPECT_STREQ(_T("ä#äf34ööcöä߀9875oe\r\nfgdjkglsfdg\r\nöäöü45g\r\nfdgi&§$%&hfdsgä\r\nä#äf34öööä߀9875oe\r\nöäcüpfgmfdg\r\n€fgfdsg\r\n45\r\näü"), fileContents
);
1006 ::DeleteFile(tmpFile
);
1009 TEST_P(CBasicGitWithTestRepoFixture
, GetOneFile
)
1013 // clean&smudge filters are not available for GetOneFile without libigt2
1014 if (GetParam() == GIT_CLI
|| GetParam() == LIBGIT
)
1017 CString cleanFilterFilename
= m_Git
.m_CurrentDir
+ L
"\\clean_filter_openssl";
1018 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)cleanFilterFilename
, L
"#!/bin/bash\nopenssl enc -base64 -aes-256-ecb -S FEEDDEADBEEF -k PASS_FIXED"));
1019 CString smudgeFilterFilename
= m_Git
.m_CurrentDir
+ L
"\\smudge_filter_openssl";
1020 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)smudgeFilterFilename
, L
"#!/bin/bash\nopenssl enc -d -base64 -aes-256-ecb -k PASS_FIXED"));
1022 CAutoRepository
repo(m_Git
.GetGitRepository());
1023 ASSERT_TRUE(repo
.IsValid());
1024 CAutoConfig
config(repo
);
1025 ASSERT_TRUE(config
.IsValid());
1026 CStringA path
= CUnicodeUtils::GetUTF8(m_Git
.m_CurrentDir
);
1027 path
.Replace('\\', '/');
1028 EXPECT_EQ(0, git_config_set_string(config
, "filter.openssl.clean", path
+ "/clean_filter_openssl"));
1029 EXPECT_EQ(0, git_config_set_string(config
, "filter.openssl.smudge", path
+ "/smudge_filter_openssl"));
1030 EXPECT_EQ(0, git_config_set_bool(config
, "filter.openssl.required", 1));
1032 CString attributesFile
= m_Git
.m_CurrentDir
+ L
"\\.gitattributes";
1033 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)attributesFile
, L
"*.enc filter=openssl\n"));
1035 CString encryptedFileOne
= m_Git
.m_CurrentDir
+ L
"\\1.enc";
1036 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)encryptedFileOne
, L
"This should be encrypted...\nAnd decrypted on the fly\n"));
1038 CString encryptedFileTwo
= m_Git
.m_CurrentDir
+ L
"\\2.enc";
1039 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)encryptedFileTwo
, L
"This should also be encrypted...\nAnd also decrypted on the fly\n"));
1042 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add 1.enc"), &output
, CP_UTF8
));
1043 EXPECT_TRUE(output
.IsEmpty());
1046 ASSERT_EQ(0, git_repository_index(index
.GetPointer(), repo
));
1047 EXPECT_EQ(0, git_index_add_bypath(index
, "2.enc"));
1048 EXPECT_EQ(0, git_index_write(index
));
1050 EXPECT_EQ(0, m_Git
.Run(_T("git.exe commit -m \"Message\""), &output
, CP_UTF8
));
1051 EXPECT_FALSE(output
.IsEmpty());
1053 CString fileContents
;
1054 CString tmpFile
= GetTempFile();
1055 EXPECT_EQ(0, m_Git
.GetOneFile(L
"HEAD", CTGitPath(L
"1.enc"), tmpFile
));
1056 EXPECT_EQ(true, CStringUtils::ReadStringFromTextFile(tmpFile
, fileContents
));
1057 EXPECT_STREQ(_T("This should be encrypted...\nAnd decrypted on the fly\n"), fileContents
);
1058 ::DeleteFile(tmpFile
);
1060 fileContents
.Empty();
1061 tmpFile
= GetTempFile();
1062 EXPECT_EQ(0, m_Git
.GetOneFile(L
"HEAD", CTGitPath(L
"2.enc"), tmpFile
));
1063 EXPECT_EQ(true, CStringUtils::ReadStringFromTextFile(tmpFile
, fileContents
));
1064 EXPECT_STREQ(_T("This should also be encrypted...\nAnd also decrypted on the fly\n"), fileContents
);
1065 ::DeleteFile(tmpFile
);
1067 EXPECT_TRUE(::DeleteFile(attributesFile
));
1069 fileContents
.Empty();
1070 tmpFile
= GetTempFile();
1071 EXPECT_EQ(0, m_Git
.GetOneFile(L
"HEAD", CTGitPath(L
"1.enc"), tmpFile
));
1072 EXPECT_EQ(true, CStringUtils::ReadStringFromTextFile(tmpFile
, fileContents
));
1073 EXPECT_STREQ(_T("U2FsdGVkX1/+7d6tvu8AABwbE+Xy7U4l5boTKjIgUkYHONqmYHD+0e6k35MgtUGx\ns11nq1QuKeFCW5wFWNSj1WcHg2n4W59xfnB7RkSSIDQ=\n"), fileContents
);
1074 ::DeleteFile(tmpFile
);
1076 fileContents
.Empty();
1077 tmpFile
= GetTempFile();
1078 EXPECT_EQ(0, m_Git
.GetOneFile(L
"HEAD", CTGitPath(L
"2.enc"), tmpFile
));
1079 EXPECT_EQ(true, CStringUtils::ReadStringFromTextFile(tmpFile
, fileContents
));
1080 EXPECT_STREQ(_T("U2FsdGVkX1/+7d6tvu8AAIDDx8qi/l0qzkSMsS2YLt8tYK1oWzj8+o78fXH0/tlO\nCRVrKqTvh9eUFklY8QFYfZfj01zBkFat+4zrW+1rV4Q=\n"), fileContents
);
1081 ::DeleteFile(tmpFile
);
1084 TEST_P(CBasicGitWithTestRepoBareFixture
, GetOneFile
)
1089 static void GetBranchDescriptions(CGit
& m_Git
)
1091 MAP_STRING_STRING descriptions
;
1092 EXPECT_EQ(0, m_Git
.GetBranchDescriptions(descriptions
));
1093 EXPECT_EQ(0, descriptions
.size());
1095 g_Git
.SetConfigValue(_T("branch.master.description"), _T("test"));
1096 g_Git
.SetConfigValue(_T("branch.subdir/branch.description"), _T("multi\nline"));
1098 EXPECT_EQ(0, m_Git
.GetBranchDescriptions(descriptions
));
1099 ASSERT_EQ(2, descriptions
.size());
1100 EXPECT_STREQ(_T("test"), descriptions
[L
"master"]);
1101 EXPECT_STREQ(_T("multi\nline"), descriptions
[L
"subdir/branch"]);
1104 TEST_P(CBasicGitWithEmptyRepositoryFixture
, GetBranchDescriptions
)
1106 GetBranchDescriptions(m_Git
);
1109 TEST_P(CBasicGitWithEmptyBareRepositoryFixture
, GetBranchDescriptions
)
1111 GetBranchDescriptions(m_Git
);
1114 TEST_P(CBasicGitWithTestRepoFixture
, Config
)
1116 EXPECT_STREQ(_T(""), m_Git
.GetConfigValue(_T("not-found")));
1118 EXPECT_STREQ(_T("false"), m_Git
.GetConfigValue(_T("core.bare")));
1119 EXPECT_STREQ(_T("true"), m_Git
.GetConfigValue(_T("core.ignorecase")));
1120 EXPECT_STREQ(_T("0"), m_Git
.GetConfigValue(_T("core.repositoryformatversion")));
1121 EXPECT_STREQ(_T("https://example.com/git/testing"), m_Git
.GetConfigValue(_T("remote.origin.url")));
1123 EXPECT_EQ(false, m_Git
.GetConfigValueBool(_T("not-found")));
1124 EXPECT_EQ(false, m_Git
.GetConfigValueBool(_T("core.bare")));
1125 EXPECT_EQ(false, m_Git
.GetConfigValueBool(_T("core.repositoryformatversion")));
1126 EXPECT_EQ(false, m_Git
.GetConfigValueBool(_T("remote.origin.url")));
1127 EXPECT_EQ(true, m_Git
.GetConfigValueBool(_T("core.ignorecase")));
1129 CString values
[] = { _T(""), _T(" "), _T("ending-with-space "), _T(" starting with-space"), _T("test1"), _T("some\\backslashes\\in\\it"), _T("with \" doublequote"), _T("with backslash before \\\" doublequote"), _T("with'quote"), _T("multi\nline"), _T("no-multi\\nline"), _T("new line at end\n") };
1130 for (int i
= 0; i
< _countof(values
); ++i
)
1133 key
.Format(_T("re-read.test%d"), i
);
1134 EXPECT_EQ(0, m_Git
.SetConfigValue(key
, values
[i
]));
1135 EXPECT_STREQ(values
[i
], m_Git
.GetConfigValue(key
));
1138 m_Git
.SetConfigValue(_T("booltest.true1"), _T("1"));
1139 m_Git
.SetConfigValue(_T("booltest.true2"), _T("100"));
1140 m_Git
.SetConfigValue(_T("booltest.true3"), _T("-2"));
1141 m_Git
.SetConfigValue(_T("booltest.true4"), _T("yes"));
1142 m_Git
.SetConfigValue(_T("booltest.true5"), _T("yEs"));
1143 m_Git
.SetConfigValue(_T("booltest.true6"), _T("true"));
1144 m_Git
.SetConfigValue(_T("booltest.true7"), _T("on"));
1145 for (int i
= 1; i
<= 6; ++i
)
1148 key
.Format(_T("booltest.true%d"), i
);
1149 EXPECT_EQ(true, m_Git
.GetConfigValueBool(key
));
1152 EXPECT_EQ(0, m_Git
.GetConfigValueInt32(_T("does-not-exist")));
1153 EXPECT_EQ(15, m_Git
.GetConfigValueInt32(_T("does-not-exist"), 15));
1154 EXPECT_EQ(0, m_Git
.GetConfigValueInt32(_T("core.repositoryformatversion")));
1155 EXPECT_EQ(1, m_Git
.GetConfigValueInt32(_T("booltest.true1")));
1156 EXPECT_EQ(100, m_Git
.GetConfigValueInt32(_T("booltest.true2")));
1157 EXPECT_EQ(-2, m_Git
.GetConfigValueInt32(_T("booltest.true3")));
1158 EXPECT_EQ(0, m_Git
.GetConfigValueInt32(_T("booltest.true4")));
1160 EXPECT_NE(0, m_Git
.UnsetConfigValue(_T("does-not-exist")));
1161 EXPECT_STREQ(_T("false"), m_Git
.GetConfigValue(_T("core.bare")));
1162 EXPECT_STREQ(_T("true"), m_Git
.GetConfigValue(_T("core.ignorecase")));
1163 EXPECT_EQ(0, m_Git
.UnsetConfigValue(_T("core.bare")));
1164 EXPECT_STREQ(_T(""), m_Git
.GetConfigValue(_T("core.bare")));
1165 EXPECT_STREQ(_T("true"), m_Git
.GetConfigValue(_T("core.ignorecase")));
1168 TEST_P(CBasicGitWithTestRepoFixture
, GetWorkingTreeChanges
)
1170 if (GetParam() != 0)
1173 // adding ansi2.txt (as a copy of ansi.txt) produces a warning
1174 m_Git
.SetConfigValue(_T("core.autocrlf"), _T("false"));
1177 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1178 EXPECT_FALSE(output
.IsEmpty());
1180 CTGitPathList
filter(CTGitPath(_T("copy")));
1184 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1185 EXPECT_TRUE(list
.IsEmpty());
1187 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1188 ASSERT_EQ(1, list
.GetCount());
1189 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1190 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1191 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1193 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1194 EXPECT_TRUE(list
.IsEmpty());
1196 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1197 ASSERT_EQ(1, list
.GetCount());
1198 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1199 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1200 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1203 CString testFile
= m_Git
.m_CurrentDir
+ L
"\\untracked-file.txt";
1204 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1205 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1206 EXPECT_TRUE(list
.IsEmpty());
1208 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1209 ASSERT_EQ(1, list
.GetCount());
1210 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1211 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1212 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1214 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1215 EXPECT_TRUE(list
.IsEmpty());
1217 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1218 ASSERT_EQ(1, list
.GetCount());
1219 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1220 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1221 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1223 // untracked file in sub-directory
1224 testFile
= m_Git
.m_CurrentDir
+ L
"\\copy\\untracked-file.txt";
1225 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1226 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1227 EXPECT_TRUE(list
.IsEmpty());
1229 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1230 ASSERT_EQ(1, list
.GetCount());
1231 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1232 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1233 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1235 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1236 EXPECT_TRUE(list
.IsEmpty());
1238 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1239 ASSERT_EQ(1, list
.GetCount());
1240 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1241 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1242 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1244 // modified file in sub-directory
1245 testFile
= m_Git
.m_CurrentDir
+ L
"\\copy\\utf8-nobom.txt";
1246 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1247 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1248 ASSERT_EQ(1, list
.GetCount());
1249 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1250 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1251 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1253 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1254 ASSERT_EQ(2, list
.GetCount());
1255 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1256 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1257 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1258 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1259 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1261 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1262 ASSERT_EQ(1, list
.GetCount());
1263 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1264 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1265 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1267 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1268 ASSERT_EQ(2, list
.GetCount());
1269 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1270 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1271 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1272 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1273 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1275 // two modified files, one in root and one in sub-directory
1277 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1278 EXPECT_FALSE(output
.IsEmpty());
1279 testFile
= m_Git
.m_CurrentDir
+ L
"\\utf8-bom.txt";
1280 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1281 testFile
= m_Git
.m_CurrentDir
+ L
"\\copy\\utf8-nobom.txt";
1282 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1283 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1284 ASSERT_EQ(2, list
.GetCount());
1285 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1286 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1287 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1288 EXPECT_STREQ(_T("utf8-bom.txt"), list
[1].GetGitPathString());
1289 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1291 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1292 ASSERT_EQ(3, list
.GetCount());
1293 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1294 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1295 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1296 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1297 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1298 EXPECT_STREQ(_T("utf8-bom.txt"), list
[2].GetGitPathString());
1299 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[2].m_Action
);
1301 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1302 ASSERT_EQ(1, list
.GetCount());
1303 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1304 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1305 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1307 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1308 ASSERT_EQ(2, list
.GetCount());
1309 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1310 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1311 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1312 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1313 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1315 // Staged modified file
1317 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1318 EXPECT_FALSE(output
.IsEmpty());
1319 testFile
= m_Git
.m_CurrentDir
+ L
"\\utf8-nobom.txt";
1320 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1322 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add utf8-nobom.txt"), &output
, CP_UTF8
));
1323 EXPECT_TRUE(output
.IsEmpty());
1324 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1325 ASSERT_EQ(1, list
.GetCount());
1326 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1327 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[0].GetGitPathString());
1328 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1330 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1331 ASSERT_EQ(2, list
.GetCount());
1332 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1333 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1334 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1335 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[1].GetGitPathString());
1336 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1338 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1339 ASSERT_EQ(1, list
.GetCount());
1340 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1341 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[0].GetGitPathString());
1342 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1344 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1345 ASSERT_EQ(2, list
.GetCount());
1346 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1347 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1348 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1349 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[1].GetGitPathString());
1350 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1352 // Staged modified file in subfolder
1354 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1355 EXPECT_FALSE(output
.IsEmpty());
1356 testFile
= m_Git
.m_CurrentDir
+ L
"\\copy\\utf8-nobom.txt";
1357 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1359 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add copy/utf8-nobom.txt"), &output
, CP_UTF8
));
1360 EXPECT_TRUE(output
.IsEmpty());
1361 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1362 ASSERT_EQ(1, list
.GetCount());
1363 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1364 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1365 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1367 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1368 ASSERT_EQ(2, list
.GetCount());
1369 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1370 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1371 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1372 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1373 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1375 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1376 ASSERT_EQ(1, list
.GetCount());
1377 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1378 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1379 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1381 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1382 ASSERT_EQ(2, list
.GetCount());
1383 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1384 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1385 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1386 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1387 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1389 // Modified file modified after staging
1391 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1392 EXPECT_FALSE(output
.IsEmpty());
1393 testFile
= m_Git
.m_CurrentDir
+ L
"\\copy\\utf8-nobom.txt";
1394 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1396 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add copy/utf8-nobom.txt"), &output
, CP_UTF8
));
1397 EXPECT_TRUE(output
.IsEmpty());
1398 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"now with different content after staging"));
1399 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1400 ASSERT_EQ(1, list
.GetCount());
1401 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1402 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1403 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1405 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1406 ASSERT_EQ(2, list
.GetCount());
1407 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1408 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1409 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1410 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1411 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1413 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1414 ASSERT_EQ(1, list
.GetCount());
1415 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1416 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[0].GetGitPathString());
1417 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1419 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1420 ASSERT_EQ(2, list
.GetCount());
1421 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1422 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1423 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1424 EXPECT_STREQ(_T("copy/utf8-nobom.txt"), list
[1].GetGitPathString());
1425 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1429 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1430 EXPECT_FALSE(output
.IsEmpty());
1431 EXPECT_TRUE(::DeleteFile(m_Dir
.GetTempDir()+_T("\\copy\\ansi.txt")));
1433 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1434 ASSERT_EQ(1, list
.GetCount());
1435 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1436 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1437 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1439 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1440 ASSERT_EQ(2, list
.GetCount());
1441 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1442 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1443 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1444 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1445 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1447 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1448 ASSERT_EQ(1, list
.GetCount());
1449 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1450 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1451 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1453 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1454 ASSERT_EQ(2, list
.GetCount());
1455 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1456 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1457 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1458 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1459 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1461 // deleted file, also deleted in index
1463 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1464 EXPECT_FALSE(output
.IsEmpty());
1466 EXPECT_EQ(0, m_Git
.Run(_T("git.exe rm copy/ansi.txt"), &output
, CP_UTF8
));
1467 EXPECT_FALSE(output
.IsEmpty());
1469 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1470 ASSERT_EQ(1, list
.GetCount());
1471 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1472 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1473 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1475 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1476 ASSERT_EQ(2, list
.GetCount());
1477 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1478 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1479 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1480 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1481 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1483 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1484 ASSERT_EQ(1, list
.GetCount());
1485 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1486 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1487 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1489 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1490 ASSERT_EQ(2, list
.GetCount());
1491 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1492 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1493 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1494 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1495 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1497 // file deleted in index, but still on disk
1499 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1500 EXPECT_FALSE(output
.IsEmpty());
1502 EXPECT_EQ(0, m_Git
.Run(_T("git.exe rm --cached copy/ansi.txt"), &output
, CP_UTF8
));
1503 EXPECT_FALSE(output
.IsEmpty());
1505 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1506 ASSERT_EQ(1, list
.GetCount());
1507 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1508 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1509 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1511 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1512 ASSERT_EQ(2, list
.GetCount());
1513 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1514 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1515 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1516 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1517 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1519 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1520 ASSERT_EQ(1, list
.GetCount());
1521 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1522 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1523 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1525 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1526 ASSERT_EQ(2, list
.GetCount());
1527 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1528 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1529 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1530 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1531 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1533 // file deleted in index, but still on disk, but modified
1535 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1536 EXPECT_FALSE(output
.IsEmpty());
1538 EXPECT_EQ(0, m_Git
.Run(_T("git.exe rm --cached copy/ansi.txt"), &output
, CP_UTF8
));
1539 EXPECT_FALSE(output
.IsEmpty());
1540 testFile
= m_Git
.m_CurrentDir
+ L
"\\copy\\ansi.txt";
1541 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1543 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1544 ASSERT_EQ(1, list
.GetCount());
1545 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1546 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1547 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1549 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1550 ASSERT_EQ(2, list
.GetCount());
1551 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1552 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1553 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1554 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1555 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1557 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1558 ASSERT_EQ(1, list
.GetCount());
1559 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1560 EXPECT_STREQ(_T("copy/ansi.txt"), list
[0].GetGitPathString());
1561 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[0].m_Action
);
1563 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1564 ASSERT_EQ(2, list
.GetCount());
1565 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_DELETED
, list
.GetAction());
1566 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1567 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1568 EXPECT_STREQ(_T("copy/ansi.txt"), list
[1].GetGitPathString());
1569 EXPECT_EQ(CTGitPath::LOGACTIONS_DELETED
, list
[1].m_Action
);
1571 // renamed file in same folder
1573 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1574 EXPECT_FALSE(output
.IsEmpty());
1576 EXPECT_EQ(0, m_Git
.Run(_T("git.exe mv ansi.txt ansi2.txt"), &output
, CP_UTF8
));
1577 EXPECT_TRUE(output
.IsEmpty());
1579 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1580 ASSERT_EQ(1, list
.GetCount());
1581 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
.GetAction());
1582 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1583 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
[0].m_Action
);
1585 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1586 ASSERT_EQ(2, list
.GetCount());
1587 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1588 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1589 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
[0].m_Action
);
1590 EXPECT_STREQ(_T("ascii.txt"), list
[1].GetGitPathString());
1591 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1593 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1594 ASSERT_EQ(1, list
.GetCount());
1595 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
.GetAction());
1596 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1597 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
[0].m_Action
);
1599 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1600 ASSERT_EQ(2, list
.GetCount());
1601 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1602 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1603 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
[0].m_Action
);
1604 EXPECT_STREQ(_T("ascii.txt"), list
[1].GetGitPathString());
1605 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1607 // added and staged new file
1609 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1610 EXPECT_FALSE(output
.IsEmpty());
1611 testFile
= m_Git
.m_CurrentDir
+ L
"\\copy\\test-file.txt";
1612 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"*.enc filter=openssl\n"));
1614 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add copy/test-file.txt"), &output
, CP_UTF8
));
1615 EXPECT_TRUE(output
.IsEmpty());
1617 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1618 ASSERT_EQ(1, list
.GetCount());
1619 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1620 EXPECT_STREQ(_T("copy/test-file.txt"), list
[0].GetGitPathString());
1621 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1623 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1624 ASSERT_EQ(2, list
.GetCount());
1625 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1626 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1627 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1628 EXPECT_STREQ(_T("copy/test-file.txt"), list
[1].GetGitPathString());
1629 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[1].m_Action
);
1631 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1632 ASSERT_EQ(1, list
.GetCount());
1633 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1634 EXPECT_STREQ(_T("copy/test-file.txt"), list
[0].GetGitPathString());
1635 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1637 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1638 ASSERT_EQ(2, list
.GetCount());
1639 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1640 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1641 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1642 EXPECT_STREQ(_T("copy/test-file.txt"), list
[1].GetGitPathString());
1643 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[1].m_Action
);
1645 // file copied and staged
1647 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1648 EXPECT_FALSE(output
.IsEmpty());
1649 testFile
= m_Git
.m_CurrentDir
+ L
"\\ansi.txt";
1650 EXPECT_TRUE(CopyFile(m_Git
.m_CurrentDir
+ L
"\\ansi.txt", m_Git
.m_CurrentDir
+ L
"\\ansi2.txt", TRUE
));
1652 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add ansi2.txt"), &output
, CP_UTF8
));
1653 EXPECT_TRUE(output
.IsEmpty());
1655 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1656 ASSERT_EQ(1, list
.GetCount());
1657 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1658 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1659 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1661 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1662 ASSERT_EQ(2, list
.GetCount());
1663 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1664 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1665 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1666 EXPECT_STREQ(_T("ascii.txt"), list
[1].GetGitPathString());
1667 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1669 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1670 ASSERT_EQ(1, list
.GetCount());
1671 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1672 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1673 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1675 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1676 ASSERT_EQ(2, list
.GetCount());
1677 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1678 EXPECT_STREQ(_T("ansi2.txt"), list
[0].GetGitPathString());
1679 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1680 EXPECT_STREQ(_T("ascii.txt"), list
[1].GetGitPathString());
1681 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1683 // file renamed + moved to sub-folder
1685 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1686 EXPECT_FALSE(output
.IsEmpty());
1688 EXPECT_EQ(0, m_Git
.Run(_T("git.exe mv ansi.txt copy/ansi2.txt"), &output
, CP_UTF8
));
1689 EXPECT_TRUE(output
.IsEmpty());
1691 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1692 ASSERT_EQ(1, list
.GetCount());
1693 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
.GetAction());
1694 EXPECT_STREQ(_T("copy/ansi2.txt"), list
[0].GetGitPathString());
1695 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
[0].m_Action
);
1697 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1698 ASSERT_EQ(2, list
.GetCount());
1699 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_REPLACED
, list
.GetAction());
1700 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1701 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1702 EXPECT_STREQ(_T("copy/ansi2.txt"), list
[1].GetGitPathString());
1703 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
, list
[1].m_Action
);
1705 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1706 ASSERT_EQ(1, list
.GetCount());
1707 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
| CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1708 EXPECT_STREQ(_T("copy/ansi2.txt"), list
[0].GetGitPathString());
1709 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
| CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
); // TODO
1711 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1712 ASSERT_EQ(2, list
.GetCount());
1713 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
| CTGitPath::LOGACTIONS_REPLACED
| CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1714 EXPECT_STREQ(_T("ascii.txt"), list
[0].GetGitPathString());
1715 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1716 EXPECT_STREQ(_T("copy/ansi2.txt"), list
[1].GetGitPathString());
1717 EXPECT_EQ(CTGitPath::LOGACTIONS_REPLACED
| CTGitPath::LOGACTIONS_ADDED
, list
[1].m_Action
); // TODO
1719 // conflicting files
1721 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1722 EXPECT_FALSE(output
.IsEmpty());
1724 EXPECT_EQ(0, m_Git
.Run(_T("git.exe merge forconflict"), &output
, CP_UTF8
));
1725 EXPECT_FALSE(output
.IsEmpty());
1727 EXPECT_EQ(1, m_Git
.Run(_T("git.exe merge simple-conflict"), &output
, CP_UTF8
));
1728 EXPECT_FALSE(output
.IsEmpty());
1730 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1731 ASSERT_EQ(1, list
.GetCount());
1732 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1733 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1734 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1736 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1737 ASSERT_EQ(7, list
.GetCount());
1738 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1739 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1740 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1741 EXPECT_STREQ(_T("utf16-be-bom.txt"), list
[1].GetGitPathString());
1742 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1743 EXPECT_STREQ(_T("utf16-be-nobom.txt"), list
[2].GetGitPathString());
1744 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[2].m_Action
);
1745 EXPECT_STREQ(_T("utf16-le-bom.txt"), list
[3].GetGitPathString());
1746 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[3].m_Action
);
1747 EXPECT_STREQ(_T("utf16-le-nobom.txt"), list
[4].GetGitPathString());
1748 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[4].m_Action
);
1749 EXPECT_STREQ(_T("utf8-bom.txt"), list
[5].GetGitPathString());
1750 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[5].m_Action
);
1751 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[6].GetGitPathString());
1752 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[6].m_Action
);
1754 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1755 ASSERT_EQ(1, list
.GetCount());
1756 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
, list
.GetAction());
1757 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1758 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
, list
[0].m_Action
);
1760 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, &filter
));
1761 ASSERT_EQ(7, list
.GetCount());
1762 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1763 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1764 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
, list
[0].m_Action
);
1765 EXPECT_STREQ(_T("utf16-be-bom.txt"), list
[1].GetGitPathString());
1766 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1767 EXPECT_STREQ(_T("utf16-be-nobom.txt"), list
[2].GetGitPathString());
1768 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[2].m_Action
);
1769 EXPECT_STREQ(_T("utf16-le-bom.txt"), list
[3].GetGitPathString());
1770 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[3].m_Action
);
1771 EXPECT_STREQ(_T("utf16-le-nobom.txt"), list
[4].GetGitPathString());
1772 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[4].m_Action
);
1773 EXPECT_STREQ(_T("utf8-bom.txt"), list
[5].GetGitPathString());
1774 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[5].m_Action
);
1775 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[6].GetGitPathString());
1776 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[6].m_Action
);
1779 TEST_P(CBasicGitWithTestRepoFixture
, GetWorkingTreeChanges_DeleteModifyConflict_DeletedRemotely
)
1781 if (GetParam() != 0)
1785 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1786 EXPECT_FALSE(output
.IsEmpty());
1789 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout forconflict"), &output
, CP_UTF8
));
1790 EXPECT_FALSE(output
.IsEmpty());
1792 EXPECT_EQ(0, m_Git
.Run(_T("git.exe rm ansi.txt"), &output
, CP_UTF8
));
1793 EXPECT_FALSE(output
.IsEmpty());
1795 EXPECT_EQ(0, m_Git
.Run(_T("git.exe commit -m \"Prepare conflict case\""), &output
, CP_UTF8
));
1796 EXPECT_FALSE(output
.IsEmpty());
1798 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout simple-conflict"), &output
, CP_UTF8
));
1799 EXPECT_FALSE(output
.IsEmpty());
1801 EXPECT_EQ(1, m_Git
.Run(_T("git.exe merge forconflict"), &output
, CP_UTF8
));
1802 EXPECT_FALSE(output
.IsEmpty());
1804 CTGitPathList
filter(CTGitPath(_T("copy")));
1807 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1808 ASSERT_EQ(7, list
.GetCount());
1809 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1810 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1811 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1812 EXPECT_STREQ(_T("utf16-be-bom.txt"), list
[1].GetGitPathString());
1813 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1814 EXPECT_STREQ(_T("utf16-be-nobom.txt"), list
[2].GetGitPathString());
1815 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[2].m_Action
);
1816 EXPECT_STREQ(_T("utf16-le-bom.txt"), list
[3].GetGitPathString());
1817 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[3].m_Action
);
1818 EXPECT_STREQ(_T("utf16-le-nobom.txt"), list
[4].GetGitPathString());
1819 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[4].m_Action
);
1820 EXPECT_STREQ(_T("utf8-bom.txt"), list
[5].GetGitPathString());
1821 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[5].m_Action
);
1822 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[6].GetGitPathString());
1823 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[6].m_Action
);
1825 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1826 ASSERT_EQ(7, list
.GetCount());
1827 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1828 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1829 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1830 EXPECT_STREQ(_T("utf16-be-bom.txt"), list
[1].GetGitPathString());
1831 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1832 EXPECT_STREQ(_T("utf16-be-nobom.txt"), list
[2].GetGitPathString());
1833 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[2].m_Action
);
1834 EXPECT_STREQ(_T("utf16-le-bom.txt"), list
[3].GetGitPathString());
1835 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[3].m_Action
);
1836 EXPECT_STREQ(_T("utf16-le-nobom.txt"), list
[4].GetGitPathString());
1837 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[4].m_Action
);
1838 EXPECT_STREQ(_T("utf8-bom.txt"), list
[5].GetGitPathString());
1839 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[5].m_Action
);
1840 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[6].GetGitPathString());
1841 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[6].m_Action
);
1843 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1844 ASSERT_EQ(7, list
.GetCount());
1845 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1846 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1847 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
, list
[0].m_Action
);
1848 EXPECT_STREQ(_T("utf16-be-bom.txt"), list
[1].GetGitPathString());
1849 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[1].m_Action
);
1850 EXPECT_STREQ(_T("utf16-be-nobom.txt"), list
[2].GetGitPathString());
1851 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[2].m_Action
);
1852 EXPECT_STREQ(_T("utf16-le-bom.txt"), list
[3].GetGitPathString());
1853 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[3].m_Action
);
1854 EXPECT_STREQ(_T("utf16-le-nobom.txt"), list
[4].GetGitPathString());
1855 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[4].m_Action
);
1856 EXPECT_STREQ(_T("utf8-bom.txt"), list
[5].GetGitPathString());
1857 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[5].m_Action
);
1858 EXPECT_STREQ(_T("utf8-nobom.txt"), list
[6].GetGitPathString());
1859 EXPECT_EQ(CTGitPath::LOGACTIONS_MODIFIED
, list
[6].m_Action
);
1862 TEST_P(CBasicGitWithTestRepoFixture
, GetWorkingTreeChanges_DeleteModifyConflict_DeletedLocally
)
1864 if (GetParam() != 0)
1868 EXPECT_EQ(0, m_Git
.Run(_T("git.exe reset --hard master"), &output
, CP_UTF8
));
1869 EXPECT_FALSE(output
.IsEmpty());
1872 EXPECT_EQ(0, m_Git
.Run(_T("git.exe checkout forconflict"), &output
, CP_UTF8
));
1873 EXPECT_FALSE(output
.IsEmpty());
1875 EXPECT_EQ(0, m_Git
.Run(_T("git.exe rm ansi.txt"), &output
, CP_UTF8
));
1876 EXPECT_FALSE(output
.IsEmpty());
1878 EXPECT_EQ(0, m_Git
.Run(_T("git.exe commit -m \"Prepare conflict case\""), &output
, CP_UTF8
));
1879 EXPECT_FALSE(output
.IsEmpty());
1881 EXPECT_EQ(1, m_Git
.Run(_T("git.exe merge simple-conflict"), &output
, CP_UTF8
));
1882 EXPECT_FALSE(output
.IsEmpty());
1884 CTGitPathList
filter(CTGitPath(_T("copy")));
1887 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1888 ASSERT_EQ(1, list
.GetCount());
1889 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_ADDED
, list
.GetAction());
1890 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1891 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1893 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, true, nullptr));
1894 ASSERT_EQ(1, list
.GetCount());
1895 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
.GetAction());
1896 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1897 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
| CTGitPath::LOGACTIONS_MODIFIED
, list
[0].m_Action
);
1899 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1900 ASSERT_EQ(1, list
.GetCount());
1901 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
, list
.GetAction());
1902 EXPECT_STREQ(_T("ansi.txt"), list
[0].GetGitPathString());
1903 EXPECT_EQ(CTGitPath::LOGACTIONS_UNMERGED
, list
[0].m_Action
);
1906 TEST_P(CBasicGitWithEmptyRepositoryFixture
, GetWorkingTreeChanges
)
1908 if (GetParam() != 0)
1912 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1913 EXPECT_TRUE(list
.IsEmpty());
1915 CString testFile
= m_Dir
.GetTempDir() + L
"\\test.txt";
1916 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"this is testing file."));
1917 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1918 EXPECT_TRUE(list
.IsEmpty());
1920 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add test.txt"), &output
, CP_UTF8
));
1921 EXPECT_TRUE(output
.IsEmpty());
1922 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, nullptr));
1923 ASSERT_EQ(1, list
.GetCount());
1924 // EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED, list.GetAction()); // we do not care here for the list action, as its only used in GitLogListBase and there we re-calculate it in AsyncDiffThread
1925 EXPECT_STREQ(_T("test.txt"), list
[0].GetGitPathString());
1926 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1928 CTGitPathList
filter(CTGitPath(_T("copy")));
1930 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1931 ASSERT_EQ(1, list
.GetCount());
1932 // EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED, list.GetAction()); // we do not care here for the list action, as its only used in GitLogListBase and there we re-calculate it in AsyncDiffThread
1933 EXPECT_STREQ(_T("test.txt"), list
[0].GetGitPathString());
1934 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1937 EXPECT_TRUE(::CreateDirectory(m_Dir
.GetTempDir() + L
"\\copy", nullptr));
1938 testFile
= m_Dir
.GetTempDir() + L
"\\copy\\test2.txt";
1939 EXPECT_TRUE(CStringUtils::WriteStringToTextFile((LPCTSTR
)testFile
, L
"this is another testing file."));
1940 EXPECT_EQ(0, m_Git
.Run(_T("git.exe add copy/test2.txt"), &output
, CP_UTF8
));
1941 EXPECT_TRUE(output
.IsEmpty());
1942 EXPECT_EQ(0, m_Git
.GetWorkingTreeChanges(list
, false, &filter
));
1943 ASSERT_EQ(2, list
.GetCount());
1944 // EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED, list.GetAction()); // we do not care here for the list action, as its only used in GitLogListBase and there we re-calculate it in AsyncDiffThread
1945 EXPECT_STREQ(_T("copy/test2.txt"), list
[0].GetGitPathString());
1946 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[0].m_Action
);
1947 EXPECT_STREQ(_T("test.txt"), list
[1].GetGitPathString());
1948 EXPECT_EQ(CTGitPath::LOGACTIONS_ADDED
, list
[1].m_Action
);