void CRenameDlg::OnBnClickedButtonBrowseRef() { CString ext; CString path; if (!m_originalName.IsEmpty()) { CTGitPath origname(m_sBaseDir); origname.AppendPathString(m_originalName); ext = origname.GetFileExtension(); path = origname.GetWinPathString(); } if (CAppUtils::FileOpenSave(path, nullptr, AFX_IDD_FILESAVE, 0, false, GetSafeHwnd(), ext.Mid(1), !path.IsEmpty())) { GetDlgItem(IDC_NAME)->SetFocus(); CTGitPath target(path); CString targetRoot; if (!target.HasAdminDir(&targetRoot) || g_Git.m_CurrentDir.CompareNoCase(targetRoot) != 0) { CMessageBox::Show(GetSafeHwnd(), IDS_ERR_MUSTBESAMEWT, IDS_APPNAME, MB_OK | MB_ICONEXCLAMATION); return; } CString relPath; m_sBaseDir.Replace(L"/", L"\\"); if (!PathRelativePathTo(CStrBuf(relPath, MAX_PATH), m_sBaseDir, FILE_ATTRIBUTE_DIRECTORY, path, FILE_ATTRIBUTE_DIRECTORY)) return; if (CStringUtils::StartsWith(relPath, L".\\")) relPath = relPath.Mid(2); m_name = relPath; UpdateData(FALSE); } }
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; }
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; }
// The following appeared in Paul DiLascia's Jan 1998 MSJ articles. // It loads a "hand" cursor from the winhlp32.exe module void CHyperLink::SetDefaultCursor() { if (!m_hLinkCursor) { // first try the windows hand cursor (not available on NT4) #ifndef OCR_HAND # define OCR_HAND 32649 #endif auto hHandCursor = static_cast<HCURSOR>(::LoadImage(nullptr, MAKEINTRESOURCE(OCR_HAND), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED)); if (hHandCursor) { m_hLinkCursor = hHandCursor; return; } // windows cursor not available, so try to load it from winhlp32.exe CString strWndDir; GetWindowsDirectory(CStrBuf(strWndDir, MAX_PATH), MAX_PATH); // Explorer can't handle paths longer than MAX_PATH. strWndDir += L"\\winhlp32.exe"; // This retrieves cursor #106 from winhlp32.exe, which is a hand pointer CAutoLibrary hModule = LoadLibrary(strWndDir); if (hModule) { auto hHandCursor2 = static_cast<HCURSOR>(::LoadImage(hModule, MAKEINTRESOURCE(106), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE)); if (hHandCursor2) m_hLinkCursor = CopyCursor(hHandCursor2); } } }
static CString GetProgramDataGitConfig() { if (!((CRegDWORD(L"Software\\TortoiseGit\\CygwinHack", FALSE) == TRUE) || (CRegDWORD(L"Software\\TortoiseGit\\Msys2Hack", FALSE) == TRUE))) { CString programdataConfig; if (SHGetFolderPath(nullptr, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, CStrBuf(programdataConfig, MAX_PATH)) == S_OK && programdataConfig.GetLength() < MAX_PATH - 11) /* 11 = len("\\Git\\config") */ return programdataConfig + L"\\Git\\config"; } return L""; }
CBrowseFolder::retVal CBrowseFolder::Show(HWND parent, CString& path, const CString& sDefaultPath /* = CString() */) { m_sDefaultPath = sDefaultPath; if (m_sDefaultPath.IsEmpty() && !path.IsEmpty()) { while (!PathFileExists(path) && !path.IsEmpty()) { CString p = path.Left(path.ReverseFind(L'\\')); if ((p.GetLength() == 2) && (p[1] == L':')) { p += L"\\"; if (p.Compare(path) == 0) p.Empty(); } if (p.GetLength() < 2) p.Empty(); path = p; } // if the result path already contains a path, use that as the default path m_sDefaultPath = path; } // Create a new common open file dialog CComPtr<IFileOpenDialog> pfd; if (FAILED(pfd.CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_INPROC_SERVER))) { BROWSEINFO browseInfo = {}; browseInfo.hwndOwner = parent; browseInfo.pidlRoot = m_root; browseInfo.pszDisplayName = m_displayName; browseInfo.lpszTitle = m_title; browseInfo.ulFlags = m_style; browseInfo.lParam = (LPARAM)this; browseInfo.lpfn = BrowseCallBackProc; PCIDLIST_ABSOLUTE itemIDList = SHBrowseForFolder(&browseInfo); //is the dialog canceled? if (!itemIDList) return CANCEL; SCOPE_EXIT{ CoTaskMemFree((LPVOID)itemIDList); }; if (!SHGetPathFromIDList(itemIDList, CStrBuf(path, MAX_PATH))) // MAX_PATH ok. Explorer can't handle paths longer than MAX_PATH. return NOPATH; return OK; }
bool CreateRepositoryCommand::Execute() { CString folder = this->orgCmdLinePath.GetWinPath(); if (folder.IsEmpty()) folder = g_Git.m_CurrentDir; if (folder.IsEmpty()) GetCurrentDirectory(MAX_PATH, CStrBuf(folder, MAX_PATH)); if (CheckSpecialFolder(folder)) { CString message; message.Format(IDS_WARN_GITINIT_SPECIALFOLDER, folder); if (CMessageBox::Show(hwndExplorer, message, _T("TortoiseGit"), 1, IDI_ERROR, CString(MAKEINTRESOURCE(IDS_ABORTBUTTON)), CString(MAKEINTRESOURCE(IDS_PROCEEDBUTTON))) == 1) return false; } CCreateRepoDlg dlg; dlg.m_folder = folder; if(dlg.DoModal() == IDOK) { CString message; message.Format(IDS_WARN_GITINIT_FOLDERNOTEMPTY, folder); if (dlg.m_bBare && PathIsDirectory(folder) && !PathIsDirectoryEmpty(folder) && CMessageBox::Show(hwndExplorer, message, _T("TortoiseGit"), 1, IDI_ERROR, CString(MAKEINTRESOURCE(IDS_ABORTBUTTON)), CString(MAKEINTRESOURCE(IDS_PROCEEDBUTTON))) == 1) { return false; } git_repository_init_options options = GIT_REPOSITORY_INIT_OPTIONS_INIT; options.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE; options.flags |= dlg.m_bBare ? GIT_REPOSITORY_INIT_BARE : 0; CAutoRepository repo; if (git_repository_init_ext(repo.GetPointer(), CUnicodeUtils::GetUTF8(folder), &options)) { CMessageBox::Show(hwndExplorer, CGit::GetLibGit2LastErr(_T("Could not initialize a new repository.")), _T("TortoiseGit"), MB_OK | MB_ICONERROR); return false; } if (!dlg.m_bBare) CShellUpdater::Instance().AddPathForUpdate(orgCmdLinePath); CString str; str.Format(IDS_PROC_REPOCREATED, folder); CMessageBox::Show(hwndExplorer, str, _T("TortoiseGit"), MB_OK | MB_ICONINFORMATION); return true; } return false; }
void CPatchListCtrl::OnDropFiles(HDROP hDropInfo) { UINT nNumFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, nullptr, 0); for (UINT i = 0; i < nNumFiles; ++i) { CString file; DragQueryFile(hDropInfo, i, CStrBuf(file, MAX_PATH), MAX_PATH); if (PathIsDirectory(file)) continue; // no duplicates LVFINDINFO lvInfo; lvInfo.flags = LVFI_STRING; lvInfo.psz = file; if (FindItem(&lvInfo, -1) != -1) continue; int index = InsertItem(GetItemCount(), file); if (index >= 0) SetCheck(index, true); } DragFinish(hDropInfo); SetColumnWidth(0, LVSCW_AUTOSIZE); }