PageRenderTime 1785ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/test/UnitTests/GitAdminDirTest.cpp

https://gitlab.com/cjeight/tortoisegit
C++ | 358 lines | 244 code | 96 blank | 18 comment | 10 complexity | c856e729f58ef699eefcc2832667fad2 MD5 | raw file
  1. // TortoiseGit - a Windows shell extension for easy version control
  2. // Copyright (C) 2015-2016 - TortoiseGit
  3. // Copyright (C) 2003-2008 - TortoiseSVN
  4. // This program is free software; you can redistribute it and/or
  5. // modify it under the terms of the GNU General Public License
  6. // as published by the Free Software Foundation; either version 2
  7. // of the License, or (at your option) any later version.
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. // GNU General Public License for more details.
  12. // You should have received a copy of the GNU General Public License
  13. // along with this program; if not, write to the Free Software Foundation,
  14. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  15. //
  16. #include "stdafx.h"
  17. #include "GitAdminDir.h"
  18. #include "StringUtils.h"
  19. TEST(CGitAdminDir, IsBareRepo)
  20. {
  21. CAutoTempDir tmpDir;
  22. EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
  23. CAutoRepository repo = nullptr;
  24. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
  25. EXPECT_TRUE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
  26. }
  27. TEST(CGitAdminDir, IsBareRepo_normalRepo)
  28. {
  29. CAutoTempDir tmpDir;
  30. EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
  31. CAutoRepository repo = nullptr;
  32. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
  33. EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
  34. EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir() + _T("\\.git")));
  35. EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir() + _T("\\.git\\objects")));
  36. }
  37. TEST(CGitAdminDir, IsBareRepo_ReferencedRepo)
  38. {
  39. CAutoTempDir tmpDir;
  40. CString gitFile = tmpDir.GetTempDir() + L"\\.git";
  41. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
  42. EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir()));
  43. }
  44. TEST(CGitAdminDir, IsAdminDirPath)
  45. {
  46. CAutoTempDir tmpDir;
  47. EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
  48. CAutoRepository repo = nullptr;
  49. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
  50. EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
  51. EXPECT_TRUE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.git"));
  52. EXPECT_TRUE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.git\\config"));
  53. EXPECT_TRUE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.git\\objects"));
  54. EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.gitmodules"));
  55. ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\.gitted", nullptr));
  56. EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir() + L"\\.gitted"));
  57. }
  58. TEST(CGitAdminDir, IsAdminDirPath_BareRepo)
  59. {
  60. CAutoTempDir tmpDir;
  61. EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
  62. CAutoRepository repo = nullptr;
  63. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
  64. EXPECT_FALSE(GitAdminDir::IsAdminDirPath(tmpDir.GetTempDir()));
  65. }
  66. TEST(CGitAdminDir, GetAdminDirPath_BareRepo)
  67. {
  68. CAutoTempDir tmpDir;
  69. CString adminDir;
  70. EXPECT_FALSE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
  71. EXPECT_TRUE(adminDir.IsEmpty());
  72. CAutoRepository repo = nullptr;
  73. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
  74. EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
  75. EXPECT_STREQ(tmpDir.GetTempDir() + _T("\\"), adminDir);
  76. adminDir.Empty();
  77. EXPECT_FALSE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir() + L"\\objects", adminDir));
  78. EXPECT_TRUE(adminDir.IsEmpty());
  79. }
  80. TEST(CGitAdminDir, GetAdminDirPath_ReferencedRepo)
  81. {
  82. CAutoTempDir tmpDir;
  83. CString gitFile = tmpDir.GetTempDir() + L"\\.git";
  84. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L""));
  85. CString adminDir;
  86. EXPECT_FALSE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
  87. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare\n"));
  88. EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir(), adminDir));
  89. EXPECT_STREQ(L"dontcare\\", adminDir);
  90. ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\anotherdir", nullptr));
  91. gitFile = tmpDir.GetTempDir() + L"\\anotherdir\\.git";
  92. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ../something\n"));
  93. EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir() + L"\\anotherdir", adminDir));
  94. EXPECT_STREQ(tmpDir.GetTempDir() + L"\\something\\", adminDir);
  95. ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\\x6587", nullptr));
  96. gitFile = tmpDir.GetTempDir() + L"\\\x6587\\.git";
  97. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ../\x4e2d\n"));
  98. EXPECT_TRUE(GitAdminDir::GetAdminDirPath(tmpDir.GetTempDir() + L"\\\x6587", adminDir));
  99. EXPECT_STREQ(tmpDir.GetTempDir() + L"\\\x4e2d\\", adminDir);
  100. }
  101. TEST(CGitAdminDir, HasAdminDir)
  102. {
  103. CAutoTempDir tmpDir;
  104. EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
  105. CString gitFile = tmpDir.GetTempDir() + L"\\.gitted";
  106. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"something"));
  107. EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
  108. CAutoRepository repo = nullptr;
  109. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
  110. CString repoRoot;
  111. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir(), &repoRoot));
  112. EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
  113. EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + _T("\\.git"), &repoRoot));
  114. repoRoot.Empty();
  115. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + _T("\\.gitmodules"), &repoRoot));
  116. EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
  117. repoRoot.Empty();
  118. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + _T("\\something"), &repoRoot));
  119. EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
  120. ASSERT_TRUE(CreateDirectory(tmpDir.GetTempDir() + L"\\anotherdir", nullptr));
  121. repoRoot.Empty();
  122. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + _T("\\anotherdir"), &repoRoot));
  123. EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
  124. CAutoRepository subrepo = nullptr;
  125. ASSERT_TRUE(git_repository_init(subrepo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir() + _T("\\anotherdir")), false) == 0);
  126. repoRoot.Empty();
  127. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + _T("\\anotherdir"), &repoRoot));
  128. EXPECT_STREQ(tmpDir.GetTempDir() + _T("\\anotherdir"), repoRoot);
  129. repoRoot.Empty();
  130. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + _T("\\anotherdir"), true, &repoRoot));
  131. EXPECT_STREQ(tmpDir.GetTempDir() + _T("\\anotherdir"), repoRoot);
  132. repoRoot.Empty();
  133. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir() + _T("\\anotherdir"), false, &repoRoot));
  134. EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
  135. }
  136. TEST(CGitAdminDir, HasAdminDir_bareRepo)
  137. {
  138. CAutoTempDir tmpDir;
  139. EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
  140. CAutoRepository repo = nullptr;
  141. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
  142. EXPECT_FALSE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir()));
  143. EXPECT_FALSE(GitAdminDir::IsBareRepo(tmpDir.GetTempDir() + _T("\\objects")));
  144. }
  145. TEST(CGitAdminDir, HasAdminDir_ReferencedRepo)
  146. {
  147. CAutoTempDir tmpDir;
  148. CString gitFile = tmpDir.GetTempDir() + L"\\.git";
  149. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
  150. CString repoRoot;
  151. EXPECT_TRUE(GitAdminDir::HasAdminDir(tmpDir.GetTempDir(), &repoRoot));
  152. EXPECT_STREQ(tmpDir.GetTempDir(), repoRoot);
  153. }
  154. TEST(CGitAdminDir, IsWorkingTreeOrBareRepo)
  155. {
  156. CAutoTempDir tmpDir;
  157. EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
  158. CAutoRepository repo = nullptr;
  159. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), true) == 0);
  160. EXPECT_TRUE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
  161. }
  162. TEST(CGitAdminDir, IsWorkingTreeOrBareRepo_normalRepo)
  163. {
  164. CAutoTempDir tmpDir;
  165. EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
  166. CAutoRepository repo = nullptr;
  167. ASSERT_TRUE(git_repository_init(repo.GetPointer(), CUnicodeUtils::GetUTF8(tmpDir.GetTempDir()), false) == 0);
  168. EXPECT_TRUE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
  169. EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir() + _T("\\.git")));
  170. EXPECT_FALSE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir() + _T("\\.git\\objects")));
  171. }
  172. TEST(CGitAdminDir, IsWorkingTreeOrBareRepo_ReferencedRepo)
  173. {
  174. CAutoTempDir tmpDir;
  175. CString gitFile = tmpDir.GetTempDir() + L"\\.git";
  176. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
  177. EXPECT_TRUE(GitAdminDir::IsWorkingTreeOrBareRepo(tmpDir.GetTempDir()));
  178. }
  179. TEST(CGitAdminDir, ReadGitLink)
  180. {
  181. CAutoTempDir tmpDir;
  182. CString gitFile = tmpDir.GetTempDir() + L"\\.git";
  183. EXPECT_STREQ(L"", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  184. EXPECT_TRUE(::CreateDirectory(gitFile, nullptr));
  185. EXPECT_STREQ(L"", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  186. EXPECT_TRUE(::RemoveDirectory(gitFile));
  187. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"broken"));
  188. EXPECT_STREQ(L"", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  189. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
  190. EXPECT_STREQ(L"dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  191. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ./dontcare"));
  192. EXPECT_STREQ(L"C:\\somerepo\\dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  193. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: .dontcare"));
  194. EXPECT_STREQ(L"C:\\somerepo\\.dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  195. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ..dontcare"));
  196. EXPECT_STREQ(L"C:\\somerepo\\..dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  197. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: ../.git/modules/dontcare"));
  198. EXPECT_STREQ(L"C:\\.git\\modules\\dontcare", GitAdminDir::ReadGitLink(L"C:\\somerepo", gitFile));
  199. }
  200. TEST(CGitAdminDir, GetGitTopDir)
  201. {
  202. CAutoTempDir tmpDir;
  203. EXPECT_STREQ(L"", GitAdminDir::GetGitTopDir(tmpDir.GetTempDir()));
  204. CString gitFile = tmpDir.GetTempDir() + L"\\.git";
  205. CString testFile = tmpDir.GetTempDir() + L"\\.git\\test";
  206. EXPECT_TRUE(::CreateDirectory(gitFile, nullptr));
  207. EXPECT_STREQ(L"", GitAdminDir::GetGitTopDir(gitFile));
  208. EXPECT_STREQ(L"", GitAdminDir::GetGitTopDir(gitFile + L"\\test"));
  209. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(testFile, L"something"));
  210. EXPECT_STREQ(L"", GitAdminDir::GetGitTopDir(gitFile + L"\\test"));
  211. EXPECT_TRUE(::DeleteFile(testFile));
  212. EXPECT_TRUE(::RemoveDirectory(gitFile));
  213. // should not matter whether .git is a directory or file
  214. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
  215. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetGitTopDir(gitFile));
  216. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetGitTopDir(tmpDir.GetTempDir()));
  217. testFile = tmpDir.GetTempDir() + L"\\test";
  218. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetGitTopDir(testFile));
  219. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(testFile, L"something"));
  220. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetGitTopDir(testFile));
  221. EXPECT_TRUE(::CreateDirectory(tmpDir.GetTempDir() + L"\\subdir", nullptr));
  222. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetGitTopDir(tmpDir.GetTempDir() + L"\\subdir"));
  223. testFile = tmpDir.GetTempDir() + L"\\subdir\\test";
  224. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetGitTopDir(testFile));
  225. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(testFile, L"something"));
  226. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetGitTopDir(testFile));
  227. // make subdir a nested repository
  228. gitFile = tmpDir.GetTempDir() + L"\\subdir\\.git";
  229. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitFile, L"gitdir: dontcare"));
  230. EXPECT_STREQ(tmpDir.GetTempDir() + L"\\subdir", GitAdminDir::GetGitTopDir(tmpDir.GetTempDir() + L"\\subdir"));
  231. EXPECT_STREQ(tmpDir.GetTempDir() + L"\\subdir", GitAdminDir::GetGitTopDir(testFile));
  232. }
  233. TEST(CGitAdminDir, GetSuperProjectRoot)
  234. {
  235. CAutoTempDir tmpDir;
  236. EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
  237. EXPECT_TRUE(::CreateDirectory(tmpDir.GetTempDir() + L"\\.git", nullptr));
  238. EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
  239. EXPECT_TRUE(::CreateDirectory(tmpDir.GetTempDir() + L"\\subdir", nullptr));
  240. EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
  241. CString gitmodules = tmpDir.GetTempDir() + L"\\.gitmodules";
  242. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitmodules, L"something"));
  243. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir()));
  244. EXPECT_STREQ(tmpDir.GetTempDir(), GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));
  245. // make subdir a nested repository
  246. EXPECT_TRUE(::CreateDirectory(tmpDir.GetTempDir() + L"\\subdir\\.git", nullptr));
  247. EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));
  248. EXPECT_TRUE(::DeleteFile(gitmodules));
  249. EXPECT_STREQ(L"", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));
  250. gitmodules = tmpDir.GetTempDir() + L"\\subdir\\.gitmodules";
  251. EXPECT_TRUE(CStringUtils::WriteStringToTextFile(gitmodules, L"something"));
  252. EXPECT_STREQ(tmpDir.GetTempDir() + L"\\subdir", GitAdminDir::GetSuperProjectRoot(tmpDir.GetTempDir() + L"\\subdir"));
  253. }