void SubversionPathTest() { CTSVNPath testPath; testPath.SetFromWin(L"c:\\"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "C:/") == 0); testPath.SetFromWin(L"c:\\folder"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "C:/folder") == 0); testPath.SetFromWin(L"c:\\a\\b\\c\\d\\e"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "C:/a/b/c/d/e") == 0); testPath.SetFromUnknown(L"http://testing/"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "http://testing") == 0); testPath.SetFromSVN(NULL); ATLASSERT(strlen(testPath.GetSVNApiPath(pool))==0); testPath.SetFromWin(L"\\\\a\\b\\c\\d\\e"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "//a/b/c/d/e") == 0); testPath.SetFromWin(L"\\\\?\\C:\\Windows"); ATLASSERT(wcscmp(testPath.GetWinPath(), L"C:\\Windows")==0); testPath.SetFromUnknown(L"\\\\?\\C:\\Windows"); ATLASSERT(wcscmp(testPath.GetWinPath(), L"C:\\Windows")==0); #if defined(_MFC_VER) testPath.SetFromUnknown(L"http://testing again"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "http://testing%20again") == 0); testPath.SetFromUnknown(L"http://testing%20again"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "http://testing%20again") == 0); testPath.SetFromUnknown(L"http://testing special chars \344\366\374"); ATLASSERT(strcmp(testPath.GetSVNApiPath(pool), "http://testing%20special%20chars%20%c3%a4%c3%b6%c3%bc") == 0); #endif }
void CRevisionGraphWnd::GetSelected ( const CVisibleGraphNode* node , bool head , CTSVNPath& path , SVNRev& rev , SVNRev& peg) { CString repoRoot = m_state.GetRepositoryRoot(); // get path and revision path.SetFromSVN (repoRoot + CUnicodeUtils::GetUnicode (node->GetPath().GetPath().c_str())); rev = head ? SVNRev::REV_HEAD : node->GetRevision(); // handle 'modified WC' node if (node->GetClassification().Is (CNodeClassification::IS_MODIFIED_WC)) { path.SetFromUnknown (m_sPath); rev = SVNRev::REV_WC; // don't set peg, if we aren't the first node // (i.e. would not be valid for node1) if (node == m_SelectedEntry1) peg = SVNRev::REV_WC; } else { // set head, if still necessary if (head && !peg.IsValid()) peg = node->GetRevision(); } }
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()); }
svn_error_t * CCachedDirectory::GetStatusCallback(void *baton, const char *path, const svn_client_status_t *status, apr_pool_t * pool) { CCachedDirectory* pThis = (CCachedDirectory*)baton; if (path == NULL) return SVN_NO_ERROR; CTSVNPath svnPath; bool forceNormal = false; bool needsLock = false; const svn_wc_status_kind nodeStatus = status->node_status; if(status->versioned) { if ((nodeStatus != svn_wc_status_none)&&(nodeStatus != svn_wc_status_ignored)) svnPath.SetFromSVN(path, (status->kind == svn_node_dir)); else svnPath.SetFromSVN(path); if(svnPath.IsDirectory()) { if(!svnPath.IsEquivalentToWithoutCase(pThis->m_directoryPath)) { // Make sure we know about this child directory // This initial status value is likely to be overwritten from below at some point svn_wc_status_kind s = nodeStatus; if (status->conflicted) s = SVNStatus::GetMoreImportant(s, svn_wc_status_conflicted); CCachedDirectory * cdir = CSVNStatusCache::Instance().GetDirectoryCacheEntryNoCreate(svnPath); if (cdir) { // This child directory is already in our cache! // So ask this dir about its recursive status svn_wc_status_kind st = SVNStatus::GetMoreImportant(s, cdir->GetCurrentFullStatus()); pThis->SetChildStatus(svnPath, st); } else { // the child directory is not in the cache. Create a new entry for it in the cache which is // initially 'unversioned'. But we added that directory to the crawling list above, which // means the cache will be updated soon. CSVNStatusCache::Instance().GetDirectoryCacheEntry(svnPath); pThis->SetChildStatus(svnPath, s); } } } else { // only fetch the svn:needs-lock property if the status of this file is 'normal', because // if the status is something else, the needs-lock overlay won't show up anyway if ((pThis->m_pCtx)&&(nodeStatus == svn_wc_status_normal)) { const svn_string_t * value = NULL; svn_error_t * err = svn_wc_prop_get2(&value, pThis->m_pCtx->wc_ctx, path, "svn:needs-lock", pool, pool); if ((err==NULL) && value) needsLock = true; if (err) svn_error_clear(err); } } } else { if ((status->kind != svn_node_unknown)&&(status->kind != svn_node_none)) svnPath.SetFromSVN(path, status->kind == svn_node_dir); else svnPath.SetFromSVN(path); // Subversion returns no 'entry' field for versioned folders if they're // part of another working copy (nested layouts). // So we have to make sure that such an 'unversioned' folder really // is unversioned. if (((nodeStatus == svn_wc_status_unversioned)||(nodeStatus == svn_wc_status_ignored))&&(!svnPath.IsEquivalentToWithoutCase(pThis->m_directoryPath))&&(svnPath.IsDirectory())) { if (svnPath.IsWCRoot()) { CSVNStatusCache::Instance().AddFolderForCrawling(svnPath); // Mark the directory as 'versioned' (status 'normal' for now). // This initial value will be overwritten from below some time later pThis->SetChildStatus(svnPath, svn_wc_status_normal); // Make sure the entry is also in the cache CSVNStatusCache::Instance().GetDirectoryCacheEntry(svnPath); // also mark the status in the status object as normal forceNormal = true; } else { pThis->SetChildStatus(svnPath, nodeStatus); } } else if (nodeStatus == svn_wc_status_external) { if ((status->kind == svn_node_dir) || (svnPath.IsDirectory())) { CSVNStatusCache::Instance().AddFolderForCrawling(svnPath); // Mark the directory as 'versioned' (status 'normal' for now). // This initial value will be overwritten from below some time later pThis->SetChildStatus(svnPath, svn_wc_status_normal); // we have added a directory to the child-directory list of this // directory. We now must make sure that this directory also has // an entry in the cache. CSVNStatusCache::Instance().GetDirectoryCacheEntry(svnPath); // also mark the status in the status object as normal forceNormal = true; } } else { if (svnPath.IsDirectory()) { svn_wc_status_kind s = nodeStatus; if (status->conflicted) s = SVNStatus::GetMoreImportant(s, svn_wc_status_conflicted); pThis->SetChildStatus(svnPath, s); } } } pThis->AddEntry(svnPath, status, needsLock, forceNormal); return SVN_NO_ERROR; }
UINT CSettingsLogCaches::WorkerThread(LPVOID pVoid) { CCrashReportThread crashthread; CSettingsLogCaches* dialog = (CSettingsLogCaches*)pVoid; InterlockedExchange(&dialog->m_bThreadRunning, TRUE); CoInitialize (NULL); dialog->DialogEnableWindow(IDC_CACHEUPDATE, false); dialog->progress = new CProgressDlg(); dialog->progress->SetTitle(IDS_SETTINGS_LOGCACHE_UPDATETITLE); dialog->progress->SetCancelMsg(IDS_REVGRAPH_PROGCANCEL); dialog->progress->SetTime(); dialog->progress->ShowModeless(dialog->m_hWnd); // we have to get the log from the repository root SVN svn; svn.SetPromptParentWindow(dialog->GetSafeHwnd()); CLogCachePool* caches = svn.GetLogCachePool(); CRepositoryInfo& info = caches->GetRepositoryInfo(); TRepo repo = dialog->GetSelectedRepo(); CTSVNPath urlpath; urlpath.SetFromSVN (repo.first); dialog->headRevision = info.GetHeadRevision (repo.second, urlpath); dialog->progress->SetProgress (0, dialog->headRevision); apr_pool_t *pool = svn_pool_create(NULL); try { CSVNLogQuery svnQuery (svn.GetSVNClientContext(), pool); CCacheLogQuery query (caches, &svnQuery); query.Log ( CTSVNPathList (urlpath) , dialog->headRevision , dialog->headRevision , SVNRev(0) , 0 , false // strictNodeHistory , dialog , true // includeChanges , false // includeMerges , true // includeStandardRevProps , true // includeUserRevProps , TRevPropNames()); } catch (SVNError&) { } caches->Flush(); svn_pool_destroy (pool); if (dialog->progress) { dialog->progress->Stop(); delete dialog->progress; dialog->progress = NULL; } CoUninitialize(); dialog->PostMessage (WM_REFRESH_REPOSITORYLIST); dialog->DialogEnableWindow(IDC_CACHEUPDATE, true); InterlockedExchange(&dialog->m_bThreadRunning, FALSE); return 0; }