void ValidPathAndUrlTest() { CTSVNPath testPath; testPath.SetFromWin(L"c:\\a\\b\\c.test.txt"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"D:\\.Net\\SpindleSearch\\"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\test folder\\file"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\folder\\"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\ext.ext.ext\\ext.ext.ext.ext"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\.svn"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\com\\file"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\test\\conf"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\LPT"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\test\\LPT"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\com1test"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"\\\\?\\c:\\test\\com1test"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"\\\\Share\\filename"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"\\\\Share\\filename.extension"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromWin(L"\\\\Share\\.svn"); ATLASSERT(testPath.IsValidOnWindows()); // now the negative tests testPath.SetFromWin(L"c:\\test:folder"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\file<name"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\something*else"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\folder\\file?nofile"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\ext.>ension"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\com1\\filename"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\com1"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"c:\\com1\\AuX"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"\\\\Share\\lpt9\\filename"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"\\\\Share\\prn"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromWin(L"\\\\Share\\NUL"); ATLASSERT(!testPath.IsValidOnWindows()); // now come some URL tests testPath.SetFromSVN(L"http://myserver.com/repos/trunk"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromSVN(L"https://myserver.com/repos/trunk/file%20with%20spaces"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromSVN(L"svn://myserver.com/repos/trunk/file with spaces"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromSVN(L"svn+ssh://www.myserver.com/repos/trunk"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromSVN(L"http://localhost:90/repos/trunk"); ATLASSERT(testPath.IsValidOnWindows()); testPath.SetFromSVN(L"file:///C:/SVNRepos/Tester/Proj1/tags/t2"); ATLASSERT(testPath.IsValidOnWindows()); // and some negative URL tests testPath.SetFromSVN(L"https://myserver.com/rep:os/trunk/file%20with%20spaces"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromSVN(L"svn://myserver.com/rep<os/trunk/file with spaces"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromSVN(L"svn+ssh://www.myserver.com/repos/trunk/prn/"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromSVN(L"http://localhost:90/repos/trunk/com1"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromSVN(L"http://localhost:90/repos/trunk/Blame3-%3Eblame.cpp"); ATLASSERT(!testPath.IsValidOnWindows()); testPath.SetFromSVN(L""); ATLASSERT(!testPath.IsUrl()); }
void CExportDlg::OnOK() { if (!UpdateData(TRUE)) return; // don't dismiss dialog (error message already shown by MFC framework) if (::IsWindow(m_pLogDlg->GetSafeHwnd())&&(m_pLogDlg->IsWindowVisible())) { m_pLogDlg->SendMessage(WM_CLOSE); return; } // check it the export path is a valid windows path CTSVNPath ExportDirectory; if (::PathIsRelative(m_strExportDirectory)) { ExportDirectory = CTSVNPath(sOrigCWD); ExportDirectory.AppendPathString(L"\\" + m_strExportDirectory); m_strExportDirectory = ExportDirectory.GetWinPathString(); } else ExportDirectory = CTSVNPath(m_strExportDirectory); if (!ExportDirectory.IsValidOnWindows()) { ShowEditBalloon(IDC_CHECKOUTDIRECTORY, IDS_ERR_NOVALIDPATH, IDS_ERR_ERROR, TTI_ERROR); return; } // check if the specified revision is valid if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD) { Revision = SVNRev(L"HEAD"); } else Revision = SVNRev(m_sRevision); if (!Revision.IsValid()) { ShowEditBalloon(IDC_REVISION_NUM, IDS_ERR_INVALIDREV, IDS_ERR_ERROR, TTI_ERROR); return; } bool bAutoCreateTargetName = m_bAutoCreateTargetName; m_bAutoCreateTargetName = false; m_URLCombo.SaveHistory(); m_URL = m_URLCombo.GetString(); // we need an url to export from - local paths won't work if (!SVN::PathIsURL(CTSVNPath(m_URL))) { m_tooltips.ShowBalloon(IDC_URLCOMBO, IDS_ERR_MUSTBEURL, IDS_ERR_ERROR, TTI_ERROR); m_bAutoCreateTargetName = bAutoCreateTargetName; return; } if (m_strExportDirectory.IsEmpty()) { m_bAutoCreateTargetName = bAutoCreateTargetName; return; } // if the export directory does not exist, where should we export to? // We ask if the directory should be created... if (!PathFileExists(m_strExportDirectory)) { CPathUtils::MakeSureDirectoryPathExists(m_strExportDirectory); } // if the directory we should export to is not empty, show a warning: // maybe the user doesn't want to overwrite the existing files. if (!PathIsDirectoryEmpty(m_strExportDirectory)) { CString message; message.Format(CString(MAKEINTRESOURCE(IDS_WARN_FOLDERNOTEMPTY)),(LPCTSTR)m_strExportDirectory); CTaskDialog taskdlg(message, CString(MAKEINTRESOURCE(IDS_WARN_FOLDERNOTEMPTY_TASK2)), L"TortoiseSVN", 0, TDF_ENABLE_HYPERLINKS | TDF_USE_COMMAND_LINKS | TDF_ALLOW_DIALOG_CANCELLATION | TDF_POSITION_RELATIVE_TO_WINDOW | TDF_SIZE_TO_CONTENT); taskdlg.AddCommandControl(1, CString(MAKEINTRESOURCE(IDS_WARN_FOLDERNOTEMPTY_TASK3_1))); taskdlg.AddCommandControl(2, CString(MAKEINTRESOURCE(IDS_WARN_FOLDERNOTEMPTY_TASK4))); taskdlg.SetCommonButtons(TDCBF_CANCEL_BUTTON); taskdlg.SetDefaultCommandControl(2); taskdlg.SetMainIcon(TD_WARNING_ICON); bool doIt = (taskdlg.DoModal(GetExplorerHWND()) == 1); if (!doIt) { m_bAutoCreateTargetName = bAutoCreateTargetName; return; //don't dismiss the dialog } } m_eolCombo.GetWindowText(m_eolStyle); if (m_eolStyle.Compare(L"default")==0) m_eolStyle.Empty(); switch (m_depthCombo.GetCurSel()) { case 0: m_depth = svn_depth_infinity; break; case 1: m_depth = svn_depth_immediates; break; case 2: m_depth = svn_depth_files; break; case 3: m_depth = svn_depth_empty; break; default: m_depth = svn_depth_empty; break; } UpdateData(FALSE); CRegDWORD regNoExt(L"Software\\TortoiseSVN\\noext"); regNoExt = m_bNoExternals; CResizableStandAloneDialog::OnOK(); }