CString GitAdminDir::ReadGitLink(const CString& topDir, const CString& dotGitPath) { CAutoFILE pFile = _wfsopen(dotGitPath, L"r", SH_DENYWR); if (!pFile) return L""; int size = 65536; auto buffer = std::make_unique<char[]>(size); int length = (int)fread(buffer.get(), sizeof(char), size, pFile); CStringA gitPathA(buffer.get(), length); if (length < 8 || !CStringUtils::StartsWith(gitPathA, "gitdir: ")) return L""; CString gitPath = CUnicodeUtils::GetUnicode(gitPathA); // trim after converting to UTF-16, because CStringA trim does not work when having UTF-8 chars gitPath = gitPath.Trim().Mid((int)wcslen(L"gitdir: ")); gitPath.Replace('/', '\\'); if (!gitPath.IsEmpty() && gitPath[0] == L'.') { gitPath = CPathUtils::BuildPathWithPathDelimiter(topDir) + gitPath; CString adminDir; PathCanonicalize(CStrBuf(adminDir, MAX_PATH), gitPath); return adminDir; } CPathUtils::TrimTrailingPathDelimiter(gitPath); return gitPath; }
CString GitAdminDir::ReadGitLink(const CString& topDir, const CString& dotGitPath) { CAutoFILE pFile = _tfsopen(dotGitPath, _T("r"), SH_DENYWR); if (!pFile) return _T(""); int size = 65536; auto buffer = std::make_unique<char[]>(size); int length = (int)fread(buffer.get(), sizeof(char), size, pFile); CStringA gitPathA(buffer.get(), length); if (length < 8 || gitPathA.Left(8) != "gitdir: ") return _T(""); CString gitPath = CUnicodeUtils::GetUnicode(gitPathA); // trim after converting to UTF-16, because CStringA trim does not work when having UTF-8 chars gitPath = gitPath.Trim().Mid(8); // 8 = len("gitdir: ") gitPath.Replace('/', '\\'); gitPath.TrimRight('\\'); if (!gitPath.IsEmpty() && gitPath[0] == _T('.')) { gitPath = topDir + _T("\\") + gitPath; CString adminDir; PathCanonicalize(CStrBuf(adminDir, MAX_PATH), gitPath); return adminDir; } return gitPath; }
/** * Returns the .git-path (if .git is a file, read the repository path and return it) * adminDir always ends with "\" */ bool GitAdminDir::GetAdminDirPath(const CString &projectTopDir, CString &adminDir) const { if (IsBareRepo(projectTopDir)) { adminDir = projectTopDir; adminDir.TrimRight('\\'); adminDir.Append(_T("\\")); return true; } CString sDotGitPath = projectTopDir + _T("\\") + g_GitAdminDir.GetAdminDirName(); if (CTGitPath(sDotGitPath).IsDirectory()) { sDotGitPath.TrimRight('\\'); sDotGitPath.Append(_T("\\")); adminDir = sDotGitPath; return true; } else { FILE *pFile; _tfopen_s(&pFile, sDotGitPath, _T("r")); if (!pFile) return false; int size = 65536; std::unique_ptr<char[]> buffer(new char[size]); SecureZeroMemory(buffer.get(), size); fread(buffer.get(), sizeof(char), size, pFile); fclose(pFile); CStringA gitPathA(buffer.get()); if (gitPathA.Left(8) != "gitdir: ") return false; CString gitPath = CUnicodeUtils::GetUnicode(gitPathA.Trim().Mid(8)); // 8 = len("gitdir: ") gitPath.Replace('/', '\\'); gitPath.TrimRight('\\'); gitPath.Append(_T("\\")); if (gitPath.GetLength() > 0 && gitPath[0] == _T('.')) { gitPath = projectTopDir + _T("\\") + gitPath; PathCanonicalize(adminDir.GetBuffer(MAX_PATH), gitPath.GetBuffer()); adminDir.ReleaseBuffer(); gitPath.ReleaseBuffer(); return true; } adminDir = gitPath; return true; } }