void CCloneDlg::OnBnClickedCloneBrowseUrl() { CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strCloneDirectory; int sel = (int)this->m_BrowseUrl.GetCurrentEntry(); this->m_regBrowseUrl = sel; if( sel == 1 ) { CString str; m_URLCombo.GetWindowText(str); str.Trim(); if (str.IsEmpty()) { CMessageBox::Show(GetSafeHwnd(), IDS_PROC_CLONE_URLDIREMPTY, IDS_APPNAME, MB_ICONERROR); return; } if (CAppUtils::ExploreTo(GetSafeHwnd(), str) && (int)ShellExecute(nullptr, _T("open"), str, nullptr, nullptr, SW_SHOW) <= 32) MessageBox(CFormatMessageWrapper(), _T("TortoiseGit"), MB_ICONERROR); return; } this->m_URLCombo.GetWindowTextW(strCloneDirectory); if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) { this->m_URLCombo.SetWindowTextW(strCloneDirectory); } }
void COpenDlg::OnBnClickedDirectorybrowse() { CBrowseFolder folderBrowser; UpdateData(); folderBrowser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; folderBrowser.Show(GetSafeHwnd(), m_sPatchDirectory, m_sPatchDirectory); UpdateData(FALSE); }
void CFileSearchDlg::OnBnClickedChooseButton() { CBrowseFolder dlg; CString path; m_DirectoryEdit.GetWindowText(path); if (dlg.Show(m_hWnd, path, path) == CBrowseFolder::retVal::OK) { m_DirectoryEdit.SetWindowText(path); } }
void CSetBugTraqAdv::OnBnClickedBugTraqbrowse() { CBrowseFolder browser; CString sPath; GetDlgItemText(IDC_BUGTRAQPATH, sPath); browser.SetInfo(CString(MAKEINTRESOURCE(IDS_SETTINGS_BUGTRAQ_SELECTFOLDERPATH))); browser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (browser.Show(m_hWnd, sPath) == CBrowseFolder::OK) SetDlgItemText(IDC_BUGTRAQPATH, sPath); }
void CSubmoduleAddDlg::OnRepBrowse() { CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strDirectory; this->m_Repository.GetWindowTextW(strDirectory); if (browseFolder.Show(GetSafeHwnd(), strDirectory) == CBrowseFolder::OK) { this->m_Repository.SetWindowTextW(strDirectory); } }
void CSubmoduleAddDlg::OnPathBrowse() { CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strDirectory; this->m_PathCtrl.GetWindowTextW(strDirectory); if (browseFolder.Show(GetSafeHwnd(), strDirectory,g_Git.m_CurrentDir) == CBrowseFolder::OK) { this->m_PathCtrl.SetWindowTextW(strDirectory); } }
void CCloneDlg::OnBnClickedCloneDirBrowse() { CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strCloneDirectory = this->m_Directory; if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) { UpdateData(TRUE); m_Directory = strCloneDirectory; UpdateData(FALSE); } }
void CSetDialogs::OnBnClickedBrowsecheckoutpath() { CBrowseFolder browser; browser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strCheckoutDirectory; if (browser.Show(GetSafeHwnd(), strCheckoutDirectory) == CBrowseFolder::OK) { UpdateData(TRUE); m_sDefaultCheckoutPath = strCheckoutDirectory; UpdateData(FALSE); SetModified(); } }
void CFormatPatchDlg::OnBnClickedButtonDir() { CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strCloneDirectory; this->UpdateData(TRUE); strCloneDirectory=m_Dir; if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) { m_Dir=strCloneDirectory; this->UpdateData(FALSE); } }
void CSetHooksAdv::OnBnClickedHookbrowse() { UpdateData(); CBrowseFolder browser; CString sPath; browser.SetInfo(CString(MAKEINTRESOURCE(IDS_SETTINGS_HOOKS_SELECTFOLDERPATH))); browser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (browser.Show(m_hWnd, sPath) == CBrowseFolder::OK) { m_sPath = sPath; UpdateData(FALSE); } }
void CSetMainPage::OnBrowseDir() { CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString dir; this->UpdateData(TRUE); dir=this->m_sMsysGitPath; if (browseFolder.Show(GetSafeHwnd(), dir) == CBrowseFolder::OK) { m_sMsysGitPath=dir; this->UpdateData(FALSE); OnMsysGitPathModify(); } SetModified(TRUE); }
void CExportDlg::OnBnClickedCheckoutdirectoryBrowse() { m_tooltips.Pop(); // hide the tooltips // // Create a folder browser dialog. If the user selects OK, we should update // the local data members with values from the controls, copy the checkout // directory from the browse folder, then restore the local values into the // dialog controls. // CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strCheckoutDirectory = m_strExportDirectory; if (browseFolder.Show(GetSafeHwnd(), strCheckoutDirectory) == CBrowseFolder::OK) { UpdateData(TRUE); m_strExportDirectory = strCheckoutDirectory; m_sExportDirOrig = m_strExportDirectory; m_bAutoCreateTargetName = !(PathIsDirectoryEmpty(m_sExportDirOrig) || !PathFileExists(m_sExportDirOrig)); UpdateData(FALSE); DialogEnableWindow(IDOK, !m_strExportDirectory.IsEmpty()); } }
void CCloneDlg::OnBnClickedCloneBrowseUrl() { CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; CString strCloneDirectory; int sel = (int)this->m_BrowseUrl.GetCurrentEntry(); this->m_regBrowseUrl = sel; if( sel == 1 ) { CString str; m_URLCombo.GetWindowText(str); ShellExecute(NULL, _T("open"), str.Trim(), NULL,NULL, SW_SHOW); return ; } this->m_URLCombo.GetWindowTextW(strCloneDirectory); if (browseFolder.Show(GetSafeHwnd(), strCloneDirectory) == CBrowseFolder::OK) { this->m_URLCombo.SetWindowTextW(strCloneDirectory); } }
void CFileDiffDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if ((pWnd==0)||(pWnd != &m_cFileList)) return; if (m_cFileList.GetSelectedCount() == 0) return; // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; m_cFileList.GetItemRect(m_cFileList.GetSelectionMark(), &rect, LVIR_LABEL); m_cFileList.ClientToScreen(&rect); point = rect.CenterPoint(); } CIconMenu popup; if (popup.CreatePopupMenu()) { popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF); popup.AppendMenuIcon(ID_BLAME, IDS_FILEDIFF_POPBLAME, IDI_BLAME); popup.AppendMenuIcon(ID_LOG, IDS_FILEDIFF_LOG, IDI_LOG); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_EXPORT, IDS_FILEDIFF_POPEXPORT, IDI_EXPORT); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_SAVEAS, IDS_FILEDIFF_POPSAVELIST, IDI_SAVEAS); popup.AppendMenuIcon(ID_CLIPBOARD_PATH, IDS_STATUSLIST_CONTEXT_COPY, IDI_COPYCLIP); popup.AppendMenuIcon(ID_CLIPBOARD_ALL, IDS_STATUSLIST_CONTEXT_COPYEXT, IDI_COPYCLIP); int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0); m_bCancelled = false; switch (cmd) { case ID_COMPARE: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); DoDiff(index, false); } } break; case ID_BLAME: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CAppUtils::LaunchTortoiseBlame(m_arFilteredList[index]->GetWinPathString(), m_rev1.m_CommitHash.ToString()); } } break; case ID_LOG: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CString cmd = _T("/command:log"); cmd += _T(" /path:\"")+m_arFilteredList[index]->GetWinPathString()+_T("\" "); cmd += _T(" /endrev:")+m_rev1.m_CommitHash.ToString(); CAppUtils::RunTortoiseProc(cmd); } } break; case ID_SAVEAS: { if (m_cFileList.GetSelectedCount() > 0) { CString temp; CTGitPath savePath; CString pathSave; if (!CAppUtils::FileOpenSave(pathSave, NULL, IDS_REPOBROWSE_SAVEAS, IDS_COMMONFILEFILTER, false, m_hWnd)) { break; } savePath = CTGitPath(pathSave); // now open the selected file for writing try { CStdioFile file(savePath.GetWinPathString(), CFile::typeBinary | CFile::modeReadWrite | CFile::modeCreate); // temp.Format(IDS_FILEDIFF_CHANGEDLISTINTRO, (LPCTSTR)m_path1.GetGitPathString(), (LPCTSTR)m_rev1.ToString(), (LPCTSTR)m_path2.GetGitPathString(), (LPCTSTR)m_rev2.ToString()); file.WriteString(temp + _T("\n")); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CTGitPath* fd = m_arFilteredList[index]; file.WriteString(fd->GetGitPathString()); file.WriteString(_T("\n")); } file.Close(); } catch (CFileException* pE) { pE->ReportError(); } } } break; case ID_CLIPBOARD_PATH: { CopySelectionToClipboard(); } break; case ID_CLIPBOARD_ALL: { CopySelectionToClipboard(TRUE); } break; case ID_EXPORT: { // export all changed files to a folder CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (browseFolder.Show(GetSafeHwnd(), m_strExportDir) == CBrowseFolder::OK) { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CTGitPath* fd = m_arFilteredList[index]; // we cannot export directories or folders if (fd->m_Action == CTGitPath::LOGACTIONS_DELETED || fd->IsDirectory()) continue; CAppUtils::CreateMultipleDirectory(m_strExportDir + _T("\\") + fd->GetDirectory().GetWinPathString()); CString filename = m_strExportDir + _T("\\") + fd->GetWinPathString(); if(m_rev1.m_CommitHash.ToString() == GIT_REV_ZERO) { if(!CopyFile(g_Git.m_CurrentDir + _T("\\") + fd->GetWinPath(), filename, false)) { MessageBox(CFormatMessageWrapper(), _T("TortoiseGit"), MB_OK | MB_ICONERROR); return; } } else { if(g_Git.GetOneFile(m_rev1.m_CommitHash, *fd, filename)) { CString out; out.Format(_T("Fail checkout one file %s;%s"), m_rev1.m_CommitHash.ToString(), fd->GetWinPath()); CMessageBox::Show(NULL, out, _T("TortoiseGit"), MB_OK); return; } } } } } break; } } }
void CFileDiffDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if ((pWnd==0)||(pWnd != &m_cFileList)) return; if (m_cFileList.GetSelectedCount() == 0) return; // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; m_cFileList.GetItemRect(m_cFileList.GetSelectionMark(), &rect, LVIR_LABEL); m_cFileList.ClientToScreen(&rect); point = rect.CenterPoint(); } CIconMenu popup; if (!popup.CreatePopupMenu()) return; popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF); popup.AppendMenuIcon(ID_UNIFIEDDIFF, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF); popup.AppendMenuIcon(ID_BLAME, IDS_FILEDIFF_POPBLAME, IDI_BLAME); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_SAVEAS, IDS_FILEDIFF_POPSAVELIST, IDI_SAVEAS); popup.AppendMenuIcon(ID_CLIPBOARD, IDS_FILEDIFF_POPCLIPBOARD, IDI_COPYCLIP); popup.AppendMenuIcon(ID_EXPORT, IDS_FILEDIFF_POPEXPORT, IDI_EXPORT); int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0); m_bCancelled = false; switch (cmd) { case ID_COMPARE: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); DoDiff(index, false); } } break; case ID_UNIFIEDDIFF: { CTSVNPath diffFile = CTempFiles::Instance().GetTempFilePath(false); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CFileDiffDlg::FileDiff fd = m_arFilteredList[index]; CTSVNPath url1 = CTSVNPath(m_path1.GetSVNPathString() + _T("/") + fd.path.GetSVNPathString()); CTSVNPath url2 = m_bDoPegDiff ? url1 : CTSVNPath(m_path2.GetSVNPathString() + _T("/") + fd.path.GetSVNPathString()); if (m_bDoPegDiff) { PegDiff(url1, m_peg, m_rev1, m_rev2, CTSVNPath(), m_depth, m_bIgnoreancestry, false, true, CString(), true, diffFile); } else { Diff(url1, m_rev1, url2, m_rev2, CTSVNPath(), m_depth, m_bIgnoreancestry, false, true, CString(), true, diffFile); } } CAppUtils::StartUnifiedDiffViewer(diffFile, CString(), false); } break; case ID_BLAME: { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); DoDiff(index, true); } } break; case ID_SAVEAS: if (m_cFileList.GetSelectedCount() > 0) { CTSVNPath savePath; CString pathSave; if (!CAppUtils::FileOpenSave(pathSave, NULL, IDS_REPOBROWSE_SAVEAS, IDS_COMMONFILEFILTER, false, m_hWnd)) { break; } savePath = CTSVNPath(pathSave); // now open the selected file for writing try { CStdioFile file(savePath.GetWinPathString(), CFile::typeBinary | CFile::modeReadWrite | CFile::modeCreate); CString temp; temp.FormatMessage(IDS_FILEDIFF_CHANGEDLISTINTRO, (LPCTSTR)m_path1.GetSVNPathString(), (LPCTSTR)m_rev1.ToString(), (LPCTSTR)m_path2.GetSVNPathString(), (LPCTSTR)m_rev2.ToString()); file.WriteString(temp + _T("\n")); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); FileDiff fd = m_arFilteredList[index]; file.WriteString(fd.path.GetSVNPathString()); file.WriteString(_T("\n")); } file.Close(); } catch (CFileException* pE) { pE->ReportError(); pE->Delete(); } } break; case ID_CLIPBOARD: CopySelectionToClipboard(); break; case ID_EXPORT: { // export all changed files to a folder CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (browseFolder.Show(GetSafeHwnd(), m_strExportDir) == CBrowseFolder::OK) { m_arSelectedFileList.RemoveAll(); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CFileDiffDlg::FileDiff fd = m_arFilteredList[index]; m_arSelectedFileList.Add(fd); } m_pProgDlg = new CProgressDlg(); InterlockedExchange(&m_bThreadRunning, TRUE); if (AfxBeginThread(ExportThreadEntry, this)==NULL) { InterlockedExchange(&m_bThreadRunning, FALSE); OnCantStartThread(); } } } break; } }
bool CheckoutCommand::Execute() { bool bRet = false; // Get the directory supplied in the command line. If there isn't // one then we should use first the default checkout path // specified in the settings dialog, and fall back to the current // working directory instead if no such path was specified. CTSVNPath checkoutDirectory; CRegString regDefCheckoutPath(_T("Software\\TortoiseGit\\DefaultCheckoutPath")); if (cmdLinePath.IsEmpty()) { if (CString(regDefCheckoutPath).IsEmpty()) { checkoutDirectory.SetFromWin(sOrigCWD, true); DWORD len = ::GetTempPath(0, NULL); TCHAR * tszPath = new TCHAR[len]; ::GetTempPath(len, tszPath); if (_tcsncicmp(checkoutDirectory.GetWinPath(), tszPath, len-2 /* \\ and \0 */) == 0) { // if the current directory is set to a temp directory, // we don't use that but leave it empty instead. checkoutDirectory.Reset(); } delete [] tszPath; } else { checkoutDirectory.SetFromWin(CString(regDefCheckoutPath)); } } else { checkoutDirectory = cmdLinePath; } CCheckoutDlg dlg; dlg.m_strCheckoutDirectory = checkoutDirectory.GetWinPathString(); dlg.m_URL = parser.GetVal(_T("url")); // if there is no url specified on the command line, check if there's one // specified in the settings dialog to use as the default and use that CRegString regDefCheckoutUrl(_T("Software\\TortoiseGit\\DefaultCheckoutUrl")); if (!CString(regDefCheckoutUrl).IsEmpty()) { // if the URL specified is a child of the default URL, we also // adjust the default checkout path // e.g. // Url specified on command line: http://server.com/repos/project/trunk/folder // Url specified as default : http://server.com/repos/project/trunk // checkout path specified : c:\work\project // --> // checkout path adjusted : c:\work\project\folder CTSVNPath clurl = CTSVNPath(dlg.m_URL); CTSVNPath defurl = CTSVNPath(CString(regDefCheckoutUrl)); if (defurl.IsAncestorOf(clurl)) { // the default url is the parent of the specified url if (CTSVNPath::CheckChild(CTSVNPath(CString(regDefCheckoutPath)), CTSVNPath(dlg.m_strCheckoutDirectory))) { dlg.m_strCheckoutDirectory = CString(regDefCheckoutPath) + clurl.GetWinPathString().Mid(defurl.GetWinPathString().GetLength()); dlg.m_strCheckoutDirectory.Replace(_T("\\\\"), _T("\\")); } } if (dlg.m_URL.IsEmpty()) dlg.m_URL = regDefCheckoutUrl; } if (dlg.m_URL.Left(5).Compare(_T("tsvn:"))==0) { dlg.m_URL = dlg.m_URL.Mid(5); if (dlg.m_URL.Find('?') >= 0) { dlg.Revision = SVNRev(dlg.m_URL.Mid(dlg.m_URL.Find('?')+1)); dlg.m_URL = dlg.m_URL.Left(dlg.m_URL.Find('?')); } } if (parser.HasKey(_T("revision"))) { SVNRev Rev = SVNRev(parser.GetVal(_T("revision"))); dlg.Revision = Rev; } if (dlg.m_URL.Find('*')>=0) { // multiple URL's specified // ask where to check them out to CBrowseFolder foldbrowse; foldbrowse.SetInfo(CString(MAKEINTRESOURCE(IDS_PROC_CHECKOUTTO))); foldbrowse.SetCheckBoxText(CString(MAKEINTRESOURCE(IDS_PROC_CHECKOUTTOPONLY))); foldbrowse.SetCheckBoxText2(CString(MAKEINTRESOURCE(IDS_PROC_CHECKOUTNOEXTERNALS))); foldbrowse.m_style = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_USENEWUI | BIF_VALIDATE; TCHAR checkoutpath[MAX_PATH]; if (foldbrowse.Show(hwndExplorer, checkoutpath, MAX_PATH, CString(regDefCheckoutPath))==CBrowseFolder::OK) { CSVNProgressDlg progDlg; theApp.m_pMainWnd = &progDlg; if (parser.HasVal(_T("closeonend"))) progDlg.SetAutoClose(parser.GetLongVal(_T("closeonend"))); progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Checkout); progDlg.SetOptions(foldbrowse.m_bCheck2 ? ProgOptIgnoreExternals : ProgOptNone); progDlg.SetPathList(CTSVNPathList(CTSVNPath(CString(checkoutpath)))); progDlg.SetUrl(dlg.m_URL); progDlg.SetRevision(dlg.Revision); progDlg.SetDepth(foldbrowse.m_bCheck ? svn_depth_empty : svn_depth_infinity); progDlg.DoModal(); bRet = !progDlg.DidErrorsOccur(); } } else if (dlg.DoModal() == IDOK) { checkoutDirectory.SetFromWin(dlg.m_strCheckoutDirectory, true); CSVNProgressDlg progDlg; theApp.m_pMainWnd = &progDlg; progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Checkout); if (parser.HasVal(_T("closeonend"))) progDlg.SetAutoClose(parser.GetLongVal(_T("closeonend"))); progDlg.SetOptions(dlg.m_bNoExternals ? ProgOptIgnoreExternals : ProgOptNone); progDlg.SetPathList(CTSVNPathList(checkoutDirectory)); progDlg.SetUrl(dlg.m_URL); progDlg.SetRevision(dlg.Revision); progDlg.SetDepth(dlg.m_depth); progDlg.DoModal(); bRet = !progDlg.DidErrorsOccur(); } return bRet; }
bool ExportCommand::Execute() { bool bRet = false; // When the user clicked on a working copy, we know that the export should // be done from that. We then have to ask where the export should go to. // If however the user clicked on an unversioned folder, we assume that // this is where the export should go to and have to ask from where // the export should be done from. bool bURL = !!SVN::PathIsURL(cmdLinePath); svn_wc_status_kind s = SVNStatus::GetAllStatus(cmdLinePath); if ((bURL)||(s == svn_wc_status_unversioned)||(s == svn_wc_status_none)) { // ask from where the export has to be done CExportDlg dlg; if (bURL) dlg.m_URL = cmdLinePath.GetSVNPathString(); else dlg.m_strExportDirectory = cmdLinePath.GetWinPathString(); if (parser.HasKey(_T("revision"))) { SVNRev Rev = SVNRev(parser.GetVal(_T("revision"))); dlg.Revision = Rev; } dlg.m_blockPathAdjustments = parser.HasKey(L"blockpathadjustments"); if (dlg.DoModal() == IDOK) { CTSVNPath exportPath(dlg.m_strExportDirectory); CSVNProgressDlg progDlg; theApp.m_pMainWnd = &progDlg; progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Export); progDlg.SetAutoClose (parser); DWORD options = dlg.m_bNoExternals ? ProgOptIgnoreExternals : ProgOptNone; options |= dlg.m_bNoKeywords ? ProgOptIgnoreKeywords : ProgOptNone; if (dlg.m_eolStyle.CompareNoCase(_T("CRLF"))==0) options |= ProgOptEolCRLF; if (dlg.m_eolStyle.CompareNoCase(_T("CR"))==0) options |= ProgOptEolCR; if (dlg.m_eolStyle.CompareNoCase(_T("LF"))==0) options |= ProgOptEolLF; progDlg.SetOptions(options); progDlg.SetPathList(CTSVNPathList(exportPath)); progDlg.SetUrl(dlg.m_URL); progDlg.SetRevision(dlg.Revision); progDlg.SetDepth(dlg.m_depth); progDlg.DoModal(); bRet = !progDlg.DidErrorsOccur(); } } else { // ask where the export should go to. CBrowseFolder folderBrowser; CString strTemp; strTemp.LoadString(IDS_PROC_EXPORT_1); folderBrowser.SetInfo(strTemp); folderBrowser.m_style = BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS | BIF_VALIDATE | BIF_EDITBOX; strTemp.LoadString(IDS_PROC_EXPORT_2); folderBrowser.SetCheckBoxText(strTemp); strTemp.LoadString(IDS_PROC_OMMITEXTERNALS); folderBrowser.SetCheckBoxText2(strTemp); folderBrowser.DisableCheckBox2WhenCheckbox1IsEnabled(true); CRegDWORD regExtended = CRegDWORD(_T("Software\\TortoiseSVN\\ExportExtended"), FALSE); CBrowseFolder::m_bCheck = regExtended; TCHAR saveto[MAX_PATH]; if (folderBrowser.Show(GetExplorerHWND(), saveto, _countof(saveto))==CBrowseFolder::OK) { CString saveplace = CString(saveto); if (cmdLinePath.IsEquivalentTo(CTSVNPath(saveplace))) { // exporting to itself: // remove all svn admin dirs, effectively unversion the 'exported' folder. CString msg; msg.Format(IDS_PROC_EXPORTUNVERSION, (LPCTSTR)saveplace); bool bUnversion = false; if (CTaskDialog::IsSupported()) { CTaskDialog taskdlg(msg, CString(MAKEINTRESOURCE(IDS_PROC_EXPORTUNVERSION_TASK2)), L"TortoiseSVN", 0, TDF_ENABLE_HYPERLINKS|TDF_USE_COMMAND_LINKS|TDF_ALLOW_DIALOG_CANCELLATION|TDF_POSITION_RELATIVE_TO_WINDOW); taskdlg.AddCommandControl(1, CString(MAKEINTRESOURCE(IDS_PROC_EXPORTUNVERSION_TASK3))); taskdlg.AddCommandControl(2, CString(MAKEINTRESOURCE(IDS_PROC_EXPORTUNVERSION_TASK4))); taskdlg.SetCommonButtons(TDCBF_CANCEL_BUTTON); taskdlg.SetDefaultCommandControl(1); taskdlg.SetMainIcon(TD_WARNING_ICON); bUnversion = (taskdlg.DoModal(GetExplorerHWND()) == 1); } else { bUnversion = (MessageBox(GetExplorerHWND(), msg, _T("TortoiseSVN"), MB_ICONQUESTION|MB_YESNO) == IDYES); } if (bUnversion) { CProgressDlg progress; progress.SetTitle(IDS_PROC_UNVERSION); progress.SetAnimation(IDR_MOVEANI); progress.FormatNonPathLine(1, IDS_SVNPROGRESS_EXPORTINGWAIT); progress.SetTime(true); progress.ShowModeless(GetExplorerHWND()); std::vector<CTSVNPath> removeVector; CDirFileEnum lister(saveplace); CString srcFile; bool bFolder = false; while (lister.NextFile(srcFile, &bFolder)) { CTSVNPath item(srcFile); if ((bFolder)&&(g_SVNAdminDir.IsAdminDirName(item.GetFileOrDirectoryName()))) { removeVector.push_back(item); } } DWORD count = 0; for (std::vector<CTSVNPath>::iterator it = removeVector.begin(); (it != removeVector.end()) && (!progress.HasUserCancelled()); ++it) { progress.FormatPathLine(1, IDS_SVNPROGRESS_UNVERSION, (LPCTSTR)it->GetWinPath()); progress.SetProgress64(count, removeVector.size()); count++; it->Delete(false); } progress.Stop(); bRet = true; } else return false; } else { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": export %s to %s\n"), (LPCTSTR)cmdLinePath.GetUIPathString(), (LPCTSTR)saveto); SVN svn; if (!svn.Export(cmdLinePath, CTSVNPath(saveplace), SVNRev::REV_WC, SVNRev::REV_WC, false, !!folderBrowser.m_bCheck2, false, svn_depth_infinity, GetExplorerHWND(), folderBrowser.m_bCheck ? SVN::SVNExportIncludeUnversioned : SVN::SVNExportNormal)) { svn.ShowErrorDialog(GetExplorerHWND(), cmdLinePath); bRet = false; } else bRet = true; regExtended = CBrowseFolder::m_bCheck; } } } return bRet; }
// CTortoiseMergeApp initialization BOOL CTortoiseMergeApp::InitInstance() { SetDllDirectory(L""); SetTaskIDPerUUID(); CCrashReport::Instance().AddUserInfoToReport(L"CommandLine", GetCommandLine()); { DWORD len = GetCurrentDirectory(0, NULL); if (len) { std::unique_ptr<TCHAR[]> originalCurrentDirectory(new TCHAR[len]); if (GetCurrentDirectory(len, originalCurrentDirectory.get())) { sOrigCWD = originalCurrentDirectory.get(); sOrigCWD = CPathUtils::GetLongPathname(sOrigCWD); } } } //set the resource dll for the required language CRegDWORD loc = CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033); long langId = loc; CString langDll; HINSTANCE hInst = NULL; do { langDll.Format(_T("%sLanguages\\TortoiseMerge%ld.dll"), (LPCTSTR)CPathUtils::GetAppParentDirectory(), langId); hInst = LoadLibrary(langDll); CString sVer = _T(STRPRODUCTVER); CString sFileVer = CPathUtils::GetVersionFromFile(langDll); if (sFileVer.Compare(sVer)!=0) { FreeLibrary(hInst); hInst = NULL; } if (hInst != NULL) AfxSetResourceHandle(hInst); else { DWORD lid = SUBLANGID(langId); lid--; if (lid > 0) { langId = MAKELANGID(PRIMARYLANGID(langId), lid); } else langId = 0; } } while ((hInst == NULL) && (langId != 0)); TCHAR buf[6] = { 0 }; _tcscpy_s(buf, _T("en")); langId = loc; CString sHelppath = CPathUtils::GetAppDirectory() + _T("TortoiseMerge_en.chm"); free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); sHelppath = CPathUtils::GetAppParentDirectory() + _T("Languages\\TortoiseMerge_en.chm"); do { GetLocaleInfo(MAKELCID(langId, SORT_DEFAULT), LOCALE_SISO639LANGNAME, buf, _countof(buf)); CString sLang = _T("_"); sLang += buf; sHelppath.Replace(_T("_en"), sLang); if (PathFileExists(sHelppath)) { free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); break; } sHelppath.Replace(sLang, _T("_en")); GetLocaleInfo(MAKELCID(langId, SORT_DEFAULT), LOCALE_SISO3166CTRYNAME, buf, _countof(buf)); sLang += _T("_"); sLang += buf; sHelppath.Replace(_T("_en"), sLang); if (PathFileExists(sHelppath)) { free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); break; } sHelppath.Replace(sLang, _T("_en")); DWORD lid = SUBLANGID(langId); lid--; if (lid > 0) { langId = MAKELANGID(PRIMARYLANGID(langId), lid); } else langId = 0; } while (langId); setlocale(LC_ALL, ""); // We need to explicitly set the thread locale to the system default one to avoid possible problems with saving files in its original codepage // The problems occures when the language of OS differs from the regional settings // See the details here: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100887 SetThreadLocale(LOCALE_SYSTEM_DEFAULT); // InitCommonControls() is required on Windows XP if an application // manifest specifies use of ComCtl32.dll version 6 or later to enable // visual styles. Otherwise, any window creation will fail. InitCommonControls(); CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); CMFCButton::EnableWindowsTheming(); EnableTaskbarInteraction(FALSE); // Initialize all Managers for usage. They are automatically constructed // if not yet present InitContextMenuManager(); InitKeyboardManager(); InitTooltipManager (); CMFCToolTipInfo params; params.m_bVislManagerTheme = TRUE; GetTooltipManager ()->SetTooltipParams ( AFX_TOOLTIP_TYPE_ALL, RUNTIME_CLASS (CMFCToolTipCtrl), ¶ms); CCmdLineParser parser = CCmdLineParser(this->m_lpCmdLine); g_sGroupingUUID = parser.GetVal(L"groupuuid"); if (parser.HasKey(_T("?")) || parser.HasKey(_T("help"))) { CString sHelpText; sHelpText.LoadString(IDS_COMMANDLINEHELP); MessageBox(NULL, sHelpText, _T("TortoiseGitMerge"), MB_ICONINFORMATION); return FALSE; } // Initialize OLE libraries if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need // Change the registry key under which our settings are stored SetRegistryKey(_T("TortoiseGitMerge")); if (CRegDWORD(_T("Software\\TortoiseGitMerge\\Debug"), FALSE)==TRUE) AfxMessageBox(AfxGetApp()->m_lpCmdLine, MB_OK | MB_ICONINFORMATION); // To create the main window, this code creates a new frame window // object and then sets it as the application's main window object CMainFrame* pFrame = new CMainFrame; if (pFrame == NULL) return FALSE; m_pMainWnd = pFrame; // create and load the frame with its resources if (!pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL)) return FALSE; // Fill in the command line options pFrame->m_Data.m_baseFile.SetFileName(parser.GetVal(_T("base"))); pFrame->m_Data.m_baseFile.SetDescriptiveName(parser.GetVal(_T("basename"))); pFrame->m_Data.m_baseFile.SetReflectedName(parser.GetVal(_T("basereflectedname"))); pFrame->m_Data.m_theirFile.SetFileName(parser.GetVal(_T("theirs"))); pFrame->m_Data.m_theirFile.SetDescriptiveName(parser.GetVal(_T("theirsname"))); pFrame->m_Data.m_theirFile.SetReflectedName(parser.GetVal(_T("theirsreflectedname"))); pFrame->m_Data.m_yourFile.SetFileName(parser.GetVal(_T("mine"))); pFrame->m_Data.m_yourFile.SetDescriptiveName(parser.GetVal(_T("minename"))); pFrame->m_Data.m_yourFile.SetReflectedName(parser.GetVal(_T("minereflectedname"))); pFrame->m_Data.m_mergedFile.SetFileName(parser.GetVal(_T("merged"))); pFrame->m_Data.m_mergedFile.SetDescriptiveName(parser.GetVal(_T("mergedname"))); pFrame->m_Data.m_mergedFile.SetReflectedName(parser.GetVal(_T("mergedreflectedname"))); pFrame->m_Data.m_sPatchPath = parser.HasVal(_T("patchpath")) ? parser.GetVal(_T("patchpath")) : _T(""); pFrame->m_Data.m_sPatchPath.Replace('/', '\\'); if (parser.HasKey(_T("patchoriginal"))) pFrame->m_Data.m_sPatchOriginal = parser.GetVal(_T("patchoriginal")); if (parser.HasKey(_T("patchpatched"))) pFrame->m_Data.m_sPatchPatched = parser.GetVal(_T("patchpatched")); pFrame->m_Data.m_sDiffFile = parser.GetVal(_T("diff")); pFrame->m_Data.m_sDiffFile.Replace('/', '\\'); if (parser.HasKey(_T("oneway"))) pFrame->m_bOneWay = TRUE; if (parser.HasKey(_T("diff"))) pFrame->m_bOneWay = FALSE; if (parser.HasKey(_T("reversedpatch"))) pFrame->m_bReversedPatch = TRUE; if (parser.HasKey(_T("saverequired"))) pFrame->m_bSaveRequired = true; if (parser.HasKey(_T("saverequiredonconflicts"))) pFrame->m_bSaveRequiredOnConflicts = true; if (parser.HasKey(_T("deletebasetheirsmineonclose"))) pFrame->m_bDeleteBaseTheirsMineOnClose = true; if (pFrame->m_Data.IsBaseFileInUse() && !pFrame->m_Data.IsYourFileInUse() && pFrame->m_Data.IsTheirFileInUse()) { pFrame->m_Data.m_yourFile.TransferDetailsFrom(pFrame->m_Data.m_theirFile); } if ((!parser.HasKey(_T("patchpath")))&&(parser.HasVal(_T("diff")))) { // a patchfile was given, but not folder path to apply the patch to // If the patchfile is located inside a working copy, then use the parent directory // of the patchfile as the target directory, otherwise ask the user for a path. if (parser.HasKey(_T("wc"))) pFrame->m_Data.m_sPatchPath = pFrame->m_Data.m_sDiffFile.Left(pFrame->m_Data.m_sDiffFile.ReverseFind('\\')); else { CBrowseFolder fbrowser; fbrowser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (fbrowser.Show(NULL, pFrame->m_Data.m_sPatchPath)==CBrowseFolder::CANCEL) return FALSE; } } if ((parser.HasKey(_T("patchpath")))&&(!parser.HasVal(_T("diff")))) { // A path was given for applying a patchfile, but // the patchfile itself was not. // So ask the user for that patchfile HRESULT hr; // Create a new common save file dialog CComPtr<IFileOpenDialog> pfd = NULL; hr = pfd.CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER); if (SUCCEEDED(hr)) { // Set the dialog options DWORD dwOptions; if (SUCCEEDED(hr = pfd->GetOptions(&dwOptions))) { hr = pfd->SetOptions(dwOptions | FOS_FILEMUSTEXIST | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST); } // Set a title if (SUCCEEDED(hr)) { CString temp; temp.LoadString(IDS_OPENDIFFFILETITLE); pfd->SetTitle(temp); } CSelectFileFilter fileFilter(IDS_PATCHFILEFILTER); hr = pfd->SetFileTypes(fileFilter.GetCount(), fileFilter); bool bAdvised = false; DWORD dwCookie = 0; CComObjectStackEx<PatchOpenDlgEventHandler> cbk; CComQIPtr<IFileDialogEvents> pEvents = cbk.GetUnknown(); { CComPtr<IFileDialogCustomize> pfdCustomize; hr = pfd->QueryInterface(IID_PPV_ARGS(&pfdCustomize)); if (SUCCEEDED(hr)) { // check if there's a unified diff on the clipboard and // add a button to the fileopen dialog if there is. UINT cFormat = RegisterClipboardFormat(_T("TSVN_UNIFIEDDIFF")); if ((cFormat)&&(OpenClipboard(NULL))) { HGLOBAL hglb = GetClipboardData(cFormat); if (hglb) { pfdCustomize->AddPushButton(101, CString(MAKEINTRESOURCE(IDS_PATCH_COPYFROMCLIPBOARD))); hr = pfd->Advise(pEvents, &dwCookie); bAdvised = SUCCEEDED(hr); } CloseClipboard(); } } } // Show the save file dialog if (SUCCEEDED(hr) && SUCCEEDED(hr = pfd->Show(pFrame->m_hWnd))) { // Get the selection from the user CComPtr<IShellItem> psiResult = NULL; hr = pfd->GetResult(&psiResult); if (bAdvised) pfd->Unadvise(dwCookie); if (SUCCEEDED(hr)) { PWSTR pszPath = NULL; hr = psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszPath); if (SUCCEEDED(hr)) { pFrame->m_Data.m_sDiffFile = pszPath; CoTaskMemFree(pszPath); } } else { // no result, which means we closed the dialog in our button handler std::wstring sTempFile; if (TrySavePatchFromClipboard(sTempFile)) pFrame->m_Data.m_sDiffFile = sTempFile.c_str(); } } else { if (bAdvised) pfd->Unadvise(dwCookie); return FALSE; } } else { OPENFILENAME ofn = {0}; // common dialog box structure TCHAR szFile[MAX_PATH] = {0}; // buffer for file name // Initialize OPENFILENAME ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = pFrame->m_hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = _countof(szFile); CString temp; temp.LoadString(IDS_OPENDIFFFILETITLE); if (temp.IsEmpty()) ofn.lpstrTitle = NULL; else ofn.lpstrTitle = temp; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER; if( HasClipboardPatch() ) { ofn.Flags |= ( OFN_ENABLETEMPLATE | OFN_ENABLEHOOK ); ofn.hInstance = AfxGetResourceHandle(); ofn.lpTemplateName = MAKEINTRESOURCE(IDD_PATCH_FILE_OPEN_CUSTOM); ofn.lpfnHook = CreatePatchFileOpenHook; } CSelectFileFilter fileFilter(IDS_PATCHFILEFILTER); ofn.lpstrFilter = fileFilter; ofn.nFilterIndex = 1; // Display the Open dialog box. if (GetOpenFileName(&ofn)==FALSE) { return FALSE; } pFrame->m_Data.m_sDiffFile = ofn.lpstrFile; } } if ( pFrame->m_Data.m_baseFile.GetFilename().IsEmpty() && pFrame->m_Data.m_yourFile.GetFilename().IsEmpty() ) { int nArgs; LPWSTR *szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); if( NULL == szArglist ) { TRACE("CommandLineToArgvW failed\n"); } else { if ( nArgs==3 || nArgs==4 ) { // Four parameters: // [0]: Program name // [1]: BASE file // [2]: my file // [3]: THEIR file (optional) // This is the same format CAppUtils::StartExtDiff // uses if %base and %mine are not set and most // other diff tools use it too. if ( PathFileExists(szArglist[1]) && PathFileExists(szArglist[2]) ) { pFrame->m_Data.m_baseFile.SetFileName(szArglist[1]); pFrame->m_Data.m_yourFile.SetFileName(szArglist[2]); if ( nArgs == 4 && PathFileExists(szArglist[3]) ) { pFrame->m_Data.m_theirFile.SetFileName(szArglist[3]); } } } else if (nArgs == 2) { // only one path specified: use it to fill the "open" dialog if (PathFileExists(szArglist[1])) { pFrame->m_Data.m_yourFile.SetFileName(szArglist[1]); pFrame->m_Data.m_yourFile.StoreFileAttributes(); } } } // Free memory allocated for CommandLineToArgvW arguments. LocalFree(szArglist); } pFrame->m_bReadOnly = !!parser.HasKey(_T("readonly")); if (GetFileAttributes(pFrame->m_Data.m_yourFile.GetFilename()) & FILE_ATTRIBUTE_READONLY) pFrame->m_bReadOnly = true; pFrame->m_bBlame = !!parser.HasKey(_T("blame")); // diffing a blame means no editing! if (pFrame->m_bBlame) pFrame->m_bReadOnly = true; pFrame->SetWindowTitle(); if (parser.HasKey(_T("createunifieddiff"))) { // user requested to create a unified diff file CString origFile = parser.GetVal(_T("origfile")); CString modifiedFile = parser.GetVal(_T("modifiedfile")); if (!origFile.IsEmpty() && !modifiedFile.IsEmpty()) { CString outfile = parser.GetVal(_T("outfile")); if (outfile.IsEmpty()) { CCommonAppUtils::FileOpenSave(outfile, NULL, IDS_SAVEASTITLE, IDS_COMMONFILEFILTER, false, NULL); } if (!outfile.IsEmpty()) { CRegStdDWORD regContextLines(L"Software\\TortoiseGitMerge\\ContextLines", (DWORD)-1); CAppUtils::CreateUnifiedDiff(origFile, modifiedFile, outfile, regContextLines, false); return FALSE; } } } pFrame->resolveMsgWnd = parser.HasVal(L"resolvemsghwnd") ? (HWND)parser.GetLongLongVal(L"resolvemsghwnd") : 0; pFrame->resolveMsgWParam = parser.HasVal(L"resolvemsgwparam") ? (WPARAM)parser.GetLongLongVal(L"resolvemsgwparam") : 0; pFrame->resolveMsgLParam = parser.HasVal(L"resolvemsglparam") ? (LPARAM)parser.GetLongLongVal(L"resolvemsglparam") : 0; // The one and only window has been initialized, so show and update it pFrame->ActivateFrame(); pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); pFrame->ShowDiffBar(!pFrame->m_bOneWay); if (!pFrame->m_Data.IsBaseFileInUse() && pFrame->m_Data.m_sPatchPath.IsEmpty() && pFrame->m_Data.m_sDiffFile.IsEmpty()) { pFrame->OnFileOpen(pFrame->m_Data.m_yourFile.InUse()); return TRUE; } int line = -2; if (parser.HasVal(_T("line"))) { line = parser.GetLongVal(_T("line")); line--; // we need the index } return pFrame->LoadViews(line); }
// CTortoiseMergeApp initialization BOOL CTortoiseMergeApp::InitInstance() { SetDllDirectory(L""); CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); CMFCButton::EnableWindowsTheming(); { DWORD len = GetCurrentDirectory(0, NULL); if (len) { auto_buffer<TCHAR> originalCurrentDirectory(len); if (GetCurrentDirectory(len, originalCurrentDirectory)) { sOrigCWD = originalCurrentDirectory; sOrigCWD = CPathUtils::GetLongPathname(sOrigCWD); } } } //set the resource dll for the required language CRegDWORD loc = CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033); long langId = loc; CString langDll; HINSTANCE hInst = NULL; do { langDll.Format(_T("%sLanguages\\TortoiseMerge%d.dll"), (LPCTSTR)CPathUtils::GetAppParentDirectory(), langId); hInst = LoadLibrary(langDll); CString sVer = _T(STRPRODUCTVER); CString sFileVer = CPathUtils::GetVersionFromFile(langDll); if (sFileVer.Compare(sVer)!=0) { FreeLibrary(hInst); hInst = NULL; } if (hInst != NULL) AfxSetResourceHandle(hInst); else { DWORD lid = SUBLANGID(langId); lid--; if (lid > 0) { langId = MAKELANGID(PRIMARYLANGID(langId), lid); } else langId = 0; } } while ((hInst == NULL) && (langId != 0)); TCHAR buf[6]; _tcscpy_s(buf, _T("en")); langId = loc; CString sHelppath; sHelppath = this->m_pszHelpFilePath; sHelppath = sHelppath.MakeLower(); sHelppath.Replace(_T(".chm"), _T("_en.chm")); free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); sHelppath = CPathUtils::GetAppParentDirectory() + _T("Languages\\TortoiseMerge_en.chm"); do { GetLocaleInfo(MAKELCID(langId, SORT_DEFAULT), LOCALE_SISO639LANGNAME, buf, _countof(buf)); CString sLang = _T("_"); sLang += buf; sHelppath.Replace(_T("_en"), sLang); if (PathFileExists(sHelppath)) { free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); break; } sHelppath.Replace(sLang, _T("_en")); GetLocaleInfo(MAKELCID(langId, SORT_DEFAULT), LOCALE_SISO3166CTRYNAME, buf, _countof(buf)); sLang += _T("_"); sLang += buf; sHelppath.Replace(_T("_en"), sLang); if (PathFileExists(sHelppath)) { free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); break; } sHelppath.Replace(sLang, _T("_en")); DWORD lid = SUBLANGID(langId); lid--; if (lid > 0) { langId = MAKELANGID(PRIMARYLANGID(langId), lid); } else langId = 0; } while (langId); setlocale(LC_ALL, ""); // We need to explicitly set the thread locale to the system default one to avoid possible problems with saving files in its original codepage // The problems occures when the language of OS differs from the regional settings // See the details here: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100887 SetThreadLocale(LOCALE_SYSTEM_DEFAULT); // InitCommonControls() is required on Windows XP if an application // manifest specifies use of ComCtl32.dll version 6 or later to enable // visual styles. Otherwise, any window creation will fail. InitCommonControls(); // Initialize all Managers for usage. They are automatically constructed // if not yet present InitContextMenuManager(); InitKeyboardManager(); CCmdLineParser parser = CCmdLineParser(this->m_lpCmdLine); if (parser.HasKey(_T("?")) || parser.HasKey(_T("help"))) { CString sHelpText; sHelpText.LoadString(IDS_COMMANDLINEHELP); MessageBox(NULL, sHelpText, _T("TortoiseMerge"), MB_ICONINFORMATION); return FALSE; } // Initialize OLE libraries if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need // Change the registry key under which our settings are stored SetRegistryKey(_T("TortoiseMerge")); if (CRegDWORD(_T("Software\\TortoiseMerge\\Debug"), FALSE)==TRUE) AfxMessageBox(AfxGetApp()->m_lpCmdLine, MB_OK | MB_ICONINFORMATION); // To create the main window, this code creates a new frame window // object and then sets it as the application's main window object CMainFrame* pFrame = new CMainFrame; if (pFrame == NULL) return FALSE; m_pMainWnd = pFrame; // create and load the frame with its resources pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); // Fill in the command line options pFrame->m_Data.m_baseFile.SetFileName(parser.GetVal(_T("base"))); pFrame->m_Data.m_baseFile.SetDescriptiveName(parser.GetVal(_T("basename"))); pFrame->m_Data.m_theirFile.SetFileName(parser.GetVal(_T("theirs"))); pFrame->m_Data.m_theirFile.SetDescriptiveName(parser.GetVal(_T("theirsname"))); pFrame->m_Data.m_yourFile.SetFileName(parser.GetVal(_T("mine"))); pFrame->m_Data.m_yourFile.SetDescriptiveName(parser.GetVal(_T("minename"))); pFrame->m_Data.m_mergedFile.SetFileName(parser.GetVal(_T("merged"))); pFrame->m_Data.m_mergedFile.SetDescriptiveName(parser.GetVal(_T("mergedname"))); pFrame->m_Data.m_sPatchPath = parser.HasVal(_T("patchpath")) ? parser.GetVal(_T("patchpath")) : _T(""); pFrame->m_Data.m_sPatchPath.Replace('/', '\\'); if (parser.HasKey(_T("patchoriginal"))) pFrame->m_Data.m_sPatchOriginal = parser.GetVal(_T("patchoriginal")); if (parser.HasKey(_T("patchpatched"))) pFrame->m_Data.m_sPatchPatched = parser.GetVal(_T("patchpatched")); pFrame->m_Data.m_sDiffFile = parser.GetVal(_T("diff")); pFrame->m_Data.m_sDiffFile.Replace('/', '\\'); if (parser.HasKey(_T("oneway"))) pFrame->m_bOneWay = TRUE; if (parser.HasKey(_T("diff"))) pFrame->m_bOneWay = FALSE; if (parser.HasKey(_T("reversedpatch"))) pFrame->m_bReversedPatch = TRUE; if (pFrame->m_Data.IsBaseFileInUse() && !pFrame->m_Data.IsYourFileInUse() && pFrame->m_Data.IsTheirFileInUse()) { pFrame->m_Data.m_yourFile.TransferDetailsFrom(pFrame->m_Data.m_theirFile); } if ((!parser.HasKey(_T("patchpath")))&&(parser.HasVal(_T("diff")))) { // a patchfile was given, but not folder path to apply the patch to // If the patchfile is located inside a working copy, then use the parent directory // of the patchfile as the target directory, otherwise ask the user for a path. if (parser.HasKey(_T("wc"))) pFrame->m_Data.m_sPatchPath = pFrame->m_Data.m_sDiffFile.Left(pFrame->m_Data.m_sDiffFile.ReverseFind('\\')); else { CBrowseFolder fbrowser; fbrowser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (fbrowser.Show(NULL, pFrame->m_Data.m_sPatchPath)==CBrowseFolder::CANCEL) return FALSE; } } if ((parser.HasKey(_T("patchpath")))&&(!parser.HasVal(_T("diff")))) { // A path was given for applying a patchfile, but // the patchfile itself was not. // So ask the user for that patchfile OPENFILENAME ofn = {0}; // common dialog box structure TCHAR szFile[MAX_PATH] = {0}; // buffer for file name // Initialize OPENFILENAME ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = pFrame->m_hWnd; ofn.lpstrFile = szFile; ofn.nMaxFile = _countof(szFile); CString temp; temp.LoadString(IDS_OPENDIFFFILETITLE); if (temp.IsEmpty()) ofn.lpstrTitle = NULL; else ofn.lpstrTitle = temp; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER; // check if there's a patchfile in the clipboard UINT cFormat = RegisterClipboardFormat(_T("TSVN_UNIFIEDDIFF")); if (cFormat) { if (OpenClipboard(NULL)) { UINT enumFormat = 0; do { if (enumFormat == cFormat) { // yes, there's a patchfile in the clipboard ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER; ofn.hInstance = AfxGetResourceHandle(); ofn.lpTemplateName = MAKEINTRESOURCE(IDD_PATCH_FILE_OPEN_CUSTOM); ofn.lpfnHook = CreatePatchFileOpenHook; } } while((enumFormat = EnumClipboardFormats(enumFormat))!=0); CloseClipboard(); } } CString sFilter; sFilter.LoadString(IDS_PATCHFILEFILTER); TCHAR * pszFilters = new TCHAR[sFilter.GetLength()+4]; _tcscpy_s (pszFilters, sFilter.GetLength()+4, sFilter); // Replace '|' delimiters with '\0's TCHAR *ptr = pszFilters + _tcslen(pszFilters); //set ptr at the NULL while (ptr != pszFilters) { if (*ptr == '|') *ptr = '\0'; ptr--; } ofn.lpstrFilter = pszFilters; ofn.nFilterIndex = 1; // Display the Open dialog box. CString tempfile; if (GetOpenFileName(&ofn)==FALSE) { delete [] pszFilters; return FALSE; } delete [] pszFilters; pFrame->m_Data.m_sDiffFile = ofn.lpstrFile; } if ( pFrame->m_Data.m_baseFile.GetFilename().IsEmpty() && pFrame->m_Data.m_yourFile.GetFilename().IsEmpty() ) { LPWSTR *szArglist; int nArgs; szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); if( NULL == szArglist ) { TRACE("CommandLineToArgvW failed\n"); } else { if ( nArgs==3 || nArgs==4 ) { // Four parameters: // [0]: Program name // [1]: BASE file // [2]: my file // [3]: THEIR file (optional) // This is the same format CAppUtils::StartExtDiff // uses if %base and %mine are not set and most // other diff tools use it too. if ( PathFileExists(szArglist[1]) && PathFileExists(szArglist[2]) ) { pFrame->m_Data.m_baseFile.SetFileName(szArglist[1]); pFrame->m_Data.m_yourFile.SetFileName(szArglist[2]); if ( nArgs == 4 && PathFileExists(szArglist[3]) ) { pFrame->m_Data.m_theirFile.SetFileName(szArglist[3]); } } } } // Free memory allocated for CommandLineToArgvW arguments. LocalFree(szArglist); } pFrame->m_bReadOnly = !!parser.HasKey(_T("readonly")); if (GetFileAttributes(pFrame->m_Data.m_yourFile.GetFilename()) & FILE_ATTRIBUTE_READONLY) pFrame->m_bReadOnly = true; pFrame->m_bBlame = !!parser.HasKey(_T("blame")); // diffing a blame means no editing! if (pFrame->m_bBlame) pFrame->m_bReadOnly = true; // try to find a suitable window title CString sYour = pFrame->m_Data.m_yourFile.GetDescriptiveName(); if (sYour.Find(_T(" - "))>=0) sYour = sYour.Left(sYour.Find(_T(" - "))); if (sYour.Find(_T(" : "))>=0) sYour = sYour.Left(sYour.Find(_T(" : "))); CString sTheir = pFrame->m_Data.m_theirFile.GetDescriptiveName(); if (sTheir.Find(_T(" - "))>=0) sTheir = sTheir.Left(sTheir.Find(_T(" - "))); if (sTheir.Find(_T(" : "))>=0) sTheir = sTheir.Left(sTheir.Find(_T(" : "))); if (!sYour.IsEmpty() && !sTheir.IsEmpty()) { if (sYour.CompareNoCase(sTheir)==0) pFrame->SetWindowText(sYour + _T(" - TortoiseMerge")); else if ((sYour.GetLength() < 10) && (sTheir.GetLength() < 10)) pFrame->SetWindowText(sYour + _T(" - ") + sTheir + _T(" - TortoiseMerge")); else { // we have two very long descriptive texts here, which // means we have to find a way to use them as a window // title in a shorter way. // for simplicity, we just use the one from "yourfile" pFrame->SetWindowText(sYour + _T(" - TortoiseMerge")); } } else if (!sYour.IsEmpty()) pFrame->SetWindowText(sYour + _T(" - TortoiseMerge")); else if (!sTheir.IsEmpty()) pFrame->SetWindowText(sTheir + _T(" - TortoiseMerge")); if (parser.HasKey(_T("createunifieddiff"))) { // user requested to create a unified diff file CString origFile = parser.GetVal(_T("origfile")); CString modifiedFile = parser.GetVal(_T("modifiedfile")); if (!origFile.IsEmpty() && !modifiedFile.IsEmpty()) { CString outfile = parser.GetVal(_T("outfile")); if (outfile.IsEmpty()) { OPENFILENAME ofn = {0}; // common dialog box structure TCHAR szFile[MAX_PATH] = {0}; // buffer for file name ofn.lStructSize = sizeof(OPENFILENAME); ofn.lpstrFile = szFile; ofn.nMaxFile = _countof(szFile); CString temp; temp.LoadString(IDS_SAVEASTITLE); if (!temp.IsEmpty()) ofn.lpstrTitle = temp; ofn.Flags = OFN_OVERWRITEPROMPT; CString sFilter; sFilter.LoadString(IDS_COMMONFILEFILTER); TCHAR * pszFilters = new TCHAR[sFilter.GetLength()+4]; _tcscpy_s (pszFilters, sFilter.GetLength()+4, sFilter); // Replace '|' delimiters with '\0's TCHAR *ptr = pszFilters + _tcslen(pszFilters); //set ptr at the NULL while (ptr != pszFilters) { if (*ptr == '|') *ptr = '\0'; ptr--; } ofn.lpstrFilter = pszFilters; ofn.nFilterIndex = 1; // Display the Save dialog box. CString sFile; if (GetSaveFileName(&ofn)==TRUE) { outfile = CString(ofn.lpstrFile); } delete [] pszFilters; } if (!outfile.IsEmpty()) { CAppUtils::CreateUnifiedDiff(origFile, modifiedFile, outfile, false); return FALSE; } } } // The one and only window has been initialized, so show and update it pFrame->ActivateFrame(); pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); pFrame->ShowDiffBar(!pFrame->m_bOneWay); if (!pFrame->m_Data.IsBaseFileInUse() && pFrame->m_Data.m_sPatchPath.IsEmpty() && pFrame->m_Data.m_sDiffFile.IsEmpty()) { pFrame->OnFileOpen(); return TRUE; } return pFrame->LoadViews(); }
void CFileDiffDlg::OnContextMenu(CWnd* pWnd, CPoint point) { if ((pWnd==0)||(pWnd != &m_cFileList)) return; if (m_cFileList.GetSelectedCount() == 0) return; // if the context menu is invoked through the keyboard, we have to use // a calculated position on where to anchor the menu on if ((point.x == -1) && (point.y == -1)) { CRect rect; m_cFileList.GetItemRect(m_cFileList.GetSelectionMark(), &rect, LVIR_LABEL); m_cFileList.ClientToScreen(&rect); point = rect.CenterPoint(); } CIconMenu popup; if (popup.CreatePopupMenu()) { int firstEntry = -1; POSITION firstPos = m_cFileList.GetFirstSelectedItemPosition(); if (firstPos) firstEntry = m_cFileList.GetNextSelectedItem(firstPos); CString menuText; popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF); popup.AppendMenuIcon(ID_GNUDIFFCOMPARE, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF); popup.AppendMenu(MF_SEPARATOR, NULL); if (!m_bIsBare) { menuText.Format(IDS_FILEDIFF_POPREVERTTOREV, (LPCTSTR)m_rev1.m_CommitHash.ToString().Left(g_Git.GetShortHASHLength())); popup.AppendMenuIcon(ID_REVERT1, menuText, IDI_REVERT); menuText.Format(IDS_FILEDIFF_POPREVERTTOREV, (LPCTSTR)m_rev2.m_CommitHash.ToString().Left(g_Git.GetShortHASHLength())); popup.AppendMenuIcon(ID_REVERT2, menuText, IDI_REVERT); popup.AppendMenu(MF_SEPARATOR, NULL); } popup.AppendMenuIcon(ID_LOG, IDS_FILEDIFF_LOG, IDI_LOG); if (firstEntry >= 0 && !m_arFilteredList[firstEntry]->IsDirectory()) { if (!m_bIsBare) { popup.AppendMenuIcon(ID_BLAME, IDS_FILEDIFF_POPBLAME, IDI_BLAME); popup.AppendMenu(MF_SEPARATOR, NULL); } popup.AppendMenuIcon(ID_EXPORT, IDS_FILEDIFF_POPEXPORT, IDI_EXPORT); } else if (firstEntry >= 0) popup.AppendMenuIcon(ID_LOGSUBMODULE, IDS_MENULOGSUBMODULE, IDI_LOG); popup.AppendMenu(MF_SEPARATOR, NULL); popup.AppendMenuIcon(ID_SAVEAS, IDS_FILEDIFF_POPSAVELIST, IDI_SAVEAS); popup.AppendMenuIcon(ID_CLIPBOARD_PATH, IDS_STATUSLIST_CONTEXT_COPY, IDI_COPYCLIP); popup.AppendMenuIcon(ID_CLIPBOARD_ALL, IDS_STATUSLIST_CONTEXT_COPYEXT, IDI_COPYCLIP); int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0); m_bCancelled = false; switch (cmd) { case ID_COMPARE: { if (!CheckMultipleDiffs()) break; POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); DoDiff(index, false); } } break; case ID_GNUDIFFCOMPARE: { if (!CheckMultipleDiffs()) break; POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { CTGitPath *fd2 = m_arFilteredList[m_cFileList.GetNextSelectedItem(pos)]; CTGitPath *fd1 = fd2; if (fd2->m_Action & CTGitPath::LOGACTIONS_REPLACED) fd1 = new CTGitPath(fd2->GetGitOldPathString()); CAppUtils::StartShowUnifiedDiff(m_hWnd, *fd2, m_rev2.m_CommitHash.ToString(), *fd1, m_rev1.m_CommitHash.ToString()); if (fd1 != fd2) delete fd1; } } break; case ID_REVERT1: RevertSelectedItemToVersion(m_rev1.m_CommitHash.ToString()); break; case ID_REVERT2: RevertSelectedItemToVersion(m_rev2.m_CommitHash.ToString()); break; case ID_BLAME: { if (!CheckMultipleDiffs()) break; POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CAppUtils::LaunchTortoiseBlame(m_arFilteredList[index]->GetWinPathString(), m_rev1.m_CommitHash.ToString()); } } break; case ID_LOG: case ID_LOGSUBMODULE: { if (!CheckMultipleDiffs()) break; POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CString sCmd = _T("/command:log"); if (sCmd == ID_LOGSUBMODULE) sCmd += _T(" /submodule"); sCmd += _T(" /path:\"") + m_arFilteredList[index]->GetWinPathString() + _T("\" "); sCmd += _T(" /endrev:") + m_rev1.m_CommitHash.ToString(); CAppUtils::RunTortoiseGitProc(sCmd); } } break; case ID_SAVEAS: { if (m_cFileList.GetSelectedCount() > 0) { CString temp; CTGitPath savePath; CString pathSave; if (!CAppUtils::FileOpenSave(pathSave, NULL, IDS_REPOBROWSE_SAVEAS, IDS_TEXTFILEFILTER, false, m_hWnd, _T(".txt"))) { break; } savePath = CTGitPath(pathSave); // now open the selected file for writing try { CStdioFile file(savePath.GetWinPathString(), CFile::typeBinary | CFile::modeReadWrite | CFile::modeCreate); if (m_path1.IsEmpty() && m_path2.IsEmpty()) temp.Format(IDS_FILEDIFF_CHANGEDLISTINTROROOT, (LPCTSTR)m_rev1.m_CommitHash.ToString(), (LPCTSTR)m_rev2.m_CommitHash.ToString()); else temp.Format(IDS_FILEDIFF_CHANGEDLISTINTRO, (LPCTSTR)m_path1.GetGitPathString(), (LPCTSTR)m_rev1.m_CommitHash.ToString(), (LPCTSTR)m_path2.GetGitPathString(), (LPCTSTR)m_rev2.m_CommitHash.ToString()); file.WriteString(temp + _T("\r\n")); POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CTGitPath* fd = m_arFilteredList[index]; file.WriteString(fd->GetGitPathString()); file.WriteString(_T("\r\n")); } file.Close(); } catch (CFileException* pE) { pE->ReportError(); } } } break; case ID_CLIPBOARD_PATH: { CopySelectionToClipboard(); } break; case ID_CLIPBOARD_ALL: { CopySelectionToClipboard(TRUE); } break; case ID_EXPORT: { // export all changed files to a folder CBrowseFolder browseFolder; browseFolder.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS; if (browseFolder.Show(GetSafeHwnd(), m_strExportDir) == CBrowseFolder::OK) { POSITION pos = m_cFileList.GetFirstSelectedItemPosition(); while (pos) { int index = m_cFileList.GetNextSelectedItem(pos); CTGitPath* fd = m_arFilteredList[index]; // we cannot export directories or folders if (fd->m_Action == CTGitPath::LOGACTIONS_DELETED || fd->IsDirectory()) continue; CPathUtils::MakeSureDirectoryPathExists(m_strExportDir + _T("\\") + fd->GetContainingDirectory().GetWinPathString()); CString filename = m_strExportDir + _T("\\") + fd->GetWinPathString(); if(m_rev1.m_CommitHash.ToString() == GIT_REV_ZERO) { if(!CopyFile(g_Git.CombinePath(fd), filename, false)) { MessageBox(CFormatMessageWrapper(), _T("TortoiseGit"), MB_OK | MB_ICONERROR); return; } } else { if(g_Git.GetOneFile(m_rev1.m_CommitHash, *fd, filename)) { CString out; out.Format(IDS_STATUSLIST_CHECKOUTFILEFAILED, (LPCTSTR)fd->GetGitPathString(), (LPCTSTR)m_rev1.m_CommitHash.ToString(), (LPCTSTR)filename); if (CMessageBox::Show(nullptr, g_Git.GetGitLastErr(out, CGit::GIT_CMD_GETONEFILE), _T("TortoiseGit"), 2, IDI_WARNING, CString(MAKEINTRESOURCE(IDS_IGNOREBUTTON)), CString(MAKEINTRESOURCE(IDS_ABORTBUTTON))) == 2) return; } } } } } break; } } }