void CEditPropExternals::OnBnClickedFindhead() { CProgressDlg progDlg; progDlg.ShowModal(m_hWnd, TRUE); progDlg.SetTitle(IDS_EDITPROPS_PROG_FINDHEADTITLE); progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_EDITPROPS_PROG_FINDHEADROOTS))); DWORD count = 0; DWORD total = (DWORD)m_externals.size()*4; SVN svn; svn.SetPromptParentWindow(m_hWnd); SVNInfo svnInfo; svnInfo.SetPromptParentWindow(m_hWnd); for (auto it = m_externals.begin(); it != m_externals.end(); ++it) { progDlg.SetProgress(count++, total); if (progDlg.HasUserCancelled()) break; if (it->root.IsEmpty()) { CTSVNPath p = it->path; p.AppendPathString(it->targetDir); it->root = svn.GetRepositoryRoot(p); } } progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_EDITPROPS_PROG_FINDHEADREVS))); SVNLogHelper logHelper; for (auto it = m_externals.begin(); it != m_externals.end(); ++it) { progDlg.SetProgress(count, total); progDlg.SetLine(2, it->url, true); if (progDlg.HasUserCancelled()) break; count += 4; if (!it->root.IsEmpty()) { auto youngestRev = logHelper.GetYoungestRev(CTSVNPath(it->fullurl)); if (!youngestRev.IsValid()) it->headrev = svn.GetHEADRevision(CTSVNPath(it->fullurl), true); else it->headrev = youngestRev; } } progDlg.Stop(); m_ExtList.Invalidate(); }
void CEditPropExternals::OnContextMenu(CWnd* /*pWnd*/, CPoint point) { int selIndex = m_ExtList.GetSelectionMark(); if (selIndex < 0) return; // nothing selected, nothing to do with a context menu int selCount = m_ExtList.GetSelectedCount(); if (selCount <= 0) return; // nothing selected, nothing to do with a context menu // 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_ExtList.GetItemRect(selIndex, &rect, LVIR_LABEL); m_ExtList.ClientToScreen(&rect); point = rect.CenterPoint(); } bool haveHead = true; POSITION pos = m_ExtList.GetFirstSelectedItemPosition(); while (pos) { int index = m_ExtList.GetNextSelectedItem(pos); if ((index >= 0)&&(index < (int)m_externals.size())) { if (m_externals[index].headrev == SVN_INVALID_REVNUM) { haveHead = false; break; } } } CIconMenu popup; if (popup.CreatePopupMenu()) { if (haveHead) popup.AppendMenuIcon(CMD_ADJUST, IDS_EDITPROPS_ADJUST_TO_HEAD); else popup.AppendMenuIcon(CMD_FETCH_AND_ADJUST, IDS_EDITPROPS_FETCH_AND_ADJUST_TO_HEAD); int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RIGHTBUTTON, point.x, point.y, this, 0); switch (cmd) { case CMD_FETCH_AND_ADJUST: { SVN svn; svn.SetPromptParentWindow(m_hWnd); SVNInfo svnInfo; svnInfo.SetPromptParentWindow(m_hWnd); SVNLogHelper logHelper; CProgressDlg progDlg; progDlg.ShowModal(m_hWnd, TRUE); progDlg.SetTitle(IDS_EDITPROPS_PROG_FINDHEADTITLE); progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_EDITPROPS_PROG_FINDHEADREVS))); DWORD count = 0; DWORD total = m_ExtList.GetSelectedCount(); POSITION p = m_ExtList.GetFirstSelectedItemPosition(); while (p) { int index = m_ExtList.GetNextSelectedItem(p); progDlg.SetProgress(count++, total); if ((index >= 0)&&(index < (int)m_externals.size())) { progDlg.SetLine(2, m_externals[index].url, true); if (m_externals[index].headrev == SVN_INVALID_REVNUM) { if (m_externals[index].root.IsEmpty()) { CTSVNPath path_ = m_externals[index].path; path_.AppendPathString(m_externals[index].targetDir); m_externals[index].root = svn.GetRepositoryRoot(path_); } auto fullurl = CTSVNPath(m_externals[index].fullurl); auto youngestRev = logHelper.GetYoungestRev(fullurl); if (!youngestRev.IsValid()) m_externals[index].headrev = svn.GetHEADRevision(fullurl, true); else m_externals[index].headrev = youngestRev; } } } progDlg.Stop(); } // intentional fall through case CMD_ADJUST: { POSITION p = m_ExtList.GetFirstSelectedItemPosition(); while (p) { int index = m_ExtList.GetNextSelectedItem(p); if ((index >= 0)&&(index < (int)m_externals.size())) { if (m_externals[index].headrev != SVN_INVALID_REVNUM) { if (m_externals[index].revision.kind == svn_opt_revision_number) { m_externals[index].revision.value.number = -1; m_externals[index].revision.kind = svn_opt_revision_unspecified; } m_externals[index].pegrevision.value.number = m_externals[index].headrev; m_externals[index].pegrevision.kind = svn_opt_revision_number; } } } m_ExtList.Invalidate(); } break; } } }
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; }