Fix typos
[TortoiseGit.git] / test / UnitTests / GitAdminDirTest.cpp
blob1cec4d1dc8811c80e9662ad28a8337a47f399cf8
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2015-2017, 2019 - TortoiseGit
4 // Copyright (C) 2003-2008 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "stdafx.h"
22 #include "GitAdminDir.h"
23 #include "StringUtils.h"
25 TEST(CGitAdminDir, IsBareRepo)
27 CAutoTempDir tmpDir;
29 EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
31 CAutoRepository repo;
32 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
34 EXPECT_TRUE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
37 TEST(CGitAdminDir, IsBareRepo_normalRepo)
39 CAutoTempDir tmpDir;
41 EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
43 CAutoRepository repo;
44 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
46 EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
48 EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir() + L"\\.git"));
50 EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir() + L"\\.git\\objects"));
53 TEST(CGitAdminDir, IsBareRepo_ReferencedRepo)
55 CAutoTempDir tmpDir;
57 CString gitFile = tmpDir.GetTempDir() + L"\\.git";
58 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
60 EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
63 TEST(CGitAdminDir, IsAdminDirPath)
65 CAutoTempDir tmpDir;
67 EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
69 CAutoRepository repo;
70 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
72 EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
74 EXPECT_TRUE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.git"));
76 EXPECT_TRUE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.git\\config"));
78 EXPECT_TRUE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.git\\objects"));
80 EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.gitmodules"));
82 ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\.gitted", nullptr));
83 EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.gitted"));
86 TEST(CGitAdminDir, IsAdminDirPath_BareRepo)
88 CAutoTempDir tmpDir;
90 EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
92 CAutoRepository repo;
93 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
95 EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
98 TEST(CGitAdminDir, GetAdminDirPath_BareRepo)
100 CAutoTempDir tmpDir;
102 CString adminDir;
103 EXPECT_FALSE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
104 EXPECT_STREQ(L"", adminDir);
106 CAutoRepository repo;
107 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
109 EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
110 EXPECT_STREQ(tmpDir.GetTempDir() + L'\\', adminDir);
112 adminDir.Empty();
113 EXPECT_FALSE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir() + L"\\objects", adminDir));
114 EXPECT_STREQ(L"", adminDir);
117 TEST(CGitAdminDir, GetAdminDirPath_ReferencedRepo)
119 CAutoTempDir tmpDir;
121 CString gitFile = tmpDir.GetTempDir() + L"\\.git";
122 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L""));
124 CString adminDir;
125 EXPECT_FALSE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
127 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare\n"));
129 EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
130 EXPECT_STREQ(tmpDir.GetTempDir() + L"\\dontcare\\", adminDir);
132 ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\anotherdir", nullptr));
133 gitFile = tmpDir.GetTempDir() + L"\\anotherdir\\.git";
134 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ../something\n"));
136 EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir() + L"\\anotherdir", adminDir));
137 EXPECT_STREQ(tmpDir.GetTempDir() + L"\\something\\", adminDir);
139 ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\\x6587", nullptr));
140 gitFile = tmpDir.GetTempDir() + L"\\\x6587\\.git";
142 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ../\x4e2d\n"));
144 EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir() + L"\\\x6587", adminDir));
145 EXPECT_STREQ(tmpDir.GetTempDir() + L"\\\x4e2d\\", adminDir);
148 TEST(CGitAdminDir, HasAdminDir)
150 CAutoTempDir tmpDir;
152 EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
154 CString gitFile = tmpDir.GetTempDir() + L"\\.gitted";
155 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"something"));
157 EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
159 CAutoRepository repo;
160 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
162 CString repoRoot;
163 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir(), &repoRoot));
164 EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
166 EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + L"\\.git", &repoRoot));
168 repoRoot.Empty();
169 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + L"\\.gitmodules", &repoRoot));
170 EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
172 repoRoot.Empty();
173 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + L"\\something", &repoRoot));
174 EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
176 ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\anotherdir", nullptr));
177 repoRoot.Empty();
178 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + L"\\anotherdir", &repoRoot));
179 EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
181 CAutoRepository subrepo;
182 ASSERT_TRUE(git_repository_init(subrepo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir() + L"\\anotherdir"), false) == 0);
184 repoRoot.Empty();
185 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + L"\\anotherdir", &repoRoot));
186 EXPECT_STREQ(tmpDir.GetTempDir() + L"\\anotherdir", repoRoot);
188 repoRoot.Empty();
189 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + L"\\anotherdir", true, &repoRoot));
190 EXPECT_STREQ(tmpDir.GetTempDir() + L"\\anotherdir", repoRoot);
192 repoRoot.Empty();
193 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + L"\\anotherdir", false, &repoRoot));
194 EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
197 TEST(CGitAdminDir, HasAdminDir_bareRepo)
199 CAutoTempDir tmpDir;
201 EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
203 CAutoRepository repo;
204 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
206 EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
208 EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir() + L"\\objects"));
211 TEST(CGitAdminDir, HasAdminDir_ReferencedRepo)
213 CAutoTempDir tmpDir;
215 CString barePath = tmpDir.GetTempDir() + L"\\bare.git";
216 ASSERT_TRUE(CreateDirectory(barePath, nullptr));
217 CAutoRepository repo;
218 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(barePath), true) == 0);
220 CString wtPath = tmpDir.GetTempDir() + L"\\wt";
221 ASSERT_TRUE(CreateDirectory(wtPath, nullptr));
223 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(wtPath + L"\\.git", L"gitdir: ../bare.git"));
225 CString repoRoot;
226 EXPECT_TRUE(GitAdminDir::HasAdminDir(wtPath, &repoRoot));
227 EXPECT_STREQ(wtPath, repoRoot);
230 TEST(CGitAdminDir, HasAdminDir_ReferencedRepo2)
232 CAutoTempDir tmpDir;
234 CAutoRepository repo;
235 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
237 EXPECT_TRUE(MoveFile(tmpDir.GetTempDir() + L"\\.git", tmpDir.GetTempDir() + L"\\_git"));
239 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(tmpDir.GetTempDir() + L"\\.git", L"gitdir: _git"));
241 CString repoRoot;
242 EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir(), &repoRoot));
243 EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
246 TEST(CGitAdminDir, HasAdminDir_InvalidRepo)
248 CAutoTempDir tmpDir;
250 EXPECT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\.git", nullptr));
252 CString repoRoot;
253 EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir(), &repoRoot));
256 TEST(CGitAdminDir, HasAdminDir_InvalidRepoFile)
258 CAutoTempDir tmpDir;
260 CString gitFile = tmpDir.GetTempDir() + L"\\.git";
261 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
263 CString repoRoot;
264 EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir(), &repoRoot));
267 TEST(CGitAdminDir, IsWorkingTreeOrBareRepo)
269 CAutoTempDir tmpDir;
271 EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
273 CAutoRepository repo;
274 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
276 EXPECT_TRUE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
279 TEST(CGitAdminDir, IsWorkingTreeOrBareRepo_normalRepo)
281 CAutoTempDir tmpDir;
283 EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
285 CAutoRepository repo;
286 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
288 EXPECT_TRUE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
290 EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir() + L"\\.git"));
292 EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir() + L"\\.git\\objects"));
295 TEST(CGitAdminDir, IsWorkingTreeOrBareRepo_ReferencedRepo)
297 CAutoTempDir tmpDir;
299 CString barePath = tmpDir.GetTempDir() + L"\\bare.git";
300 ASSERT_TRUE(CreateDirectory(barePath, nullptr));
301 CAutoRepository repo;
302 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(barePath), true) == 0);
304 CString wtPath = tmpDir.GetTempDir() + L"\\wt";
305 ASSERT_TRUE(CreateDirectory(wtPath, nullptr));
307 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(wtPath + L"\\.git", L"gitdir: ../bare.git"));
309 EXPECT_TRUE(GitAdminDir::IsWorkingTreeOrBareRepo(wtPath));
312 TEST(CGitAdminDir, IsWorkingTreeOrBareRepo_ReferencedRepo2)
314 CAutoTempDir tmpDir;
316 CAutoRepository repo;
317 ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
319 EXPECT_TRUE(MoveFile(tmpDir.GetTempDir() + L"\\.git", tmpDir.GetTempDir() + L"\\_git"));
321 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(tmpDir.GetTempDir() + L"\\.git", L"gitdir: _git"));
323 EXPECT_TRUE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
326 TEST(CGitAdminDir, IsWorkingTreeOrBareRepo_InvalidRepo)
328 CAutoTempDir tmpDir;
330 EXPECT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\.git", nullptr));
332 EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
335 TEST(CGitAdminDir, IsWorkingTreeOrBareRepo_InvalidRepoFile)
337 CAutoTempDir tmpDir;
339 CString gitFile = tmpDir.GetTempDir() + L"\\.git";
340 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
342 EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
345 TEST(CGitAdminDir, ReadGitLink)
347 CAutoTempDir tmpDir;
349 CString gitFile = tmpDir.GetTempDir() + L"\\.git";
350 EXPECT_STREQ(L"", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
352 EXPECT_TRUE(::CreateDirectory(gitFile, nullptr));
353 EXPECT_STREQ(L"", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
354 EXPECT_TRUE(::RemoveDirectory(gitFile));
356 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"broken"));
357 EXPECT_STREQ(L"", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
359 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
360 EXPECT_STREQ(L"C:\\somerepo\\dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
362 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ./dontcare"));
363 EXPECT_STREQ(L"C:\\somerepo\\dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
365 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: .dontcare"));
366 EXPECT_STREQ(L"C:\\somerepo\\.dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
368 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ..dontcare"));
369 EXPECT_STREQ(L"C:\\somerepo\\..dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
371 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ../.git/modules/dontcare"));
372 EXPECT_STREQ(L"C:\\.git\\modules\\dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
374 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: c:\\someotherrepo\\.git\\modules\\bla"));
375 EXPECT_STREQ(L"c:\\someotherrepo\\.git\\modules\\bla", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
377 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: \u6280\u672F\u6587\u6863")); // cf. issue #2453
378 EXPECT_STREQ(L"C:\\somerepo\\\u6280\u672F\u6587\u6863", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
380 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: \u6280\u672F\u6587\u6863\n")); // cf. issue #2453
381 EXPECT_STREQ(L"C:\\somerepo\\\u6280\u672F\u6587\u6863", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
384 TEST(CGitAdminDir, GetSuperProjectRoot)
386 CAutoTempDir tmpDir;
388 EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
390 EXPECT_TRUE(::CreateDirectory(tmpDir.GetTempDir() + L"\\.git", nullptr));
391 EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
393 EXPECT_TRUE(::CreateDirectory(tmpDir.GetTempDir() + L"\\subdir", nullptr));
394 EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
396 CString gitmodules = tmpDir.GetTempDir() + L"\\.gitmodules";
397 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitmodules, L"something"));
398 EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
399 EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));
401 // make subdir a nested repository
402 EXPECT_TRUE(::CreateDirectory(tmpDir.GetTempDir() + L"\\subdir\\.git", nullptr));
403 EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));
405 EXPECT_TRUE(::DeleteFile(gitmodules));
406 EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));
408 gitmodules = tmpDir.GetTempDir() + L"\\subdir\\.gitmodules";
409 EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitmodules, L"something"));
410 EXPECT_STREQ(tmpDir.GetTempDir() + L"\\subdir", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));