本文整理汇总了C++中SVNRev类的典型用法代码示例。如果您正苦于以下问题:C++ SVNRev类的具体用法?C++ SVNRev怎么用?C++ SVNRev使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了SVNRev类的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ShowUnifiedDiff
bool SVNDiff::ShowUnifiedDiff(const CTSVNPath& url1, const SVNRev& rev1,
const CTSVNPath& url2, const SVNRev& rev2,
SVNRev peg,
const CString& options,
bool bIgnoreAncestry /* = false */,
bool /*blame*/,
bool bIgnoreProperties /* = true */)
{
CTSVNPath tempfile;
if (UnifiedDiff(tempfile, url1, rev1, url2, rev2, peg, options, bIgnoreAncestry, bIgnoreProperties))
{
CString title;
CTSVNPathList list;
list.AddPath(url1);
list.AddPath(url2);
if (url1.IsEquivalentTo(url2))
title.FormatMessage(IDS_SVNDIFF_ONEURL, (LPCTSTR)rev1.ToString(), (LPCTSTR)rev2.ToString(), (LPCTSTR)url1.GetUIFileOrDirectoryName());
else
{
CTSVNPath root = list.GetCommonRoot();
CString u1 = url1.GetUIPathString().Mid(root.GetUIPathString().GetLength());
CString u2 = url2.GetUIPathString().Mid(root.GetUIPathString().GetLength());
title.FormatMessage(IDS_SVNDIFF_TWOURLS, (LPCTSTR)rev1.ToString(), (LPCTSTR)u1, (LPCTSTR)rev2.ToString(), (LPCTSTR)u2);
}
return !!CAppUtils::StartUnifiedDiffViewer(tempfile.GetWinPathString(), title);
}
return false;
}
示例2: SetEndRevision
void CMergeWizardTree::SetEndRevision(const SVNRev& rev)
{
if (rev.IsHead())
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
else
{
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
m_sEndRev = rev.ToString();
UpdateData(FALSE);
}
}
示例3: SetRevision
void CSwitchDlg::SetRevision(const SVNRev& rev)
{
if (rev.IsHead())
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
else
{
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
m_rev = rev.ToString();
UpdateData(FALSE);
}
}
示例4: UpdateData
void CEditPropExternalsValue::OnOK()
{
UpdateData();
m_sWCPath.Trim(L"\"'");
if (!CTSVNPath(m_sWCPath).IsValidOnWindows())
{
ShowEditBalloon(IDC_CHECKOUTDIRECTORY, IDS_ERR_NOVALIDPATH, IDS_ERR_ERROR, TTI_ERROR);
return;
}
if (::IsWindow(m_pLogDlg->GetSafeHwnd())&&(m_pLogDlg->IsWindowVisible()))
{
m_pLogDlg->SendMessage(WM_CLOSE);
return;
}
if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
{
m_External.revision.kind = svn_opt_revision_head;
m_sPegRev.Empty();
}
else
{
SVNRev rev = m_sRevision;
if (!rev.IsValid())
{
ShowEditBalloon(IDC_REVISION_N, IDS_ERR_INVALIDREV, IDS_ERR_ERROR, TTI_ERROR);
return;
}
m_External.revision = *rev;
}
m_URLCombo.SaveHistory();
m_URL = CTSVNPath(m_URLCombo.GetString());
m_External.url = CUnicodeUtils::GetUnicode(CPathUtils::PathEscape(CUnicodeUtils::GetUTF8(m_URL.GetSVNPathString())));
if (m_URL.GetSVNPathString().GetLength() && (m_URL.GetSVNPathString()[0] == '^'))
{
// the ^ char must not be escaped
m_External.url = CUnicodeUtils::GetUnicode(CPathUtils::PathEscape(CUnicodeUtils::GetUTF8(m_URL.GetSVNPathString().Mid(1))));
m_External.url = '^' + m_External.url;
}
if (m_sPegRev.IsEmpty())
m_External.pegrevision = *SVNRev(L"HEAD");
else
m_External.pegrevision = *SVNRev(m_sPegRev);
m_External.targetDir = m_sWCPath;
CResizableStandAloneDialog::OnOK();
}
示例5: UpdateData
void CSwitchDlg::OnBnClickedBrowse()
{
UpdateData();
SVNRev rev;
if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
{
rev = SVNRev::REV_HEAD;
}
else
rev = SVNRev(m_rev);
if (!rev.IsValid())
rev = SVNRev::REV_HEAD;
CAppUtils::BrowseRepository(m_repoRoot, m_URLCombo, this, rev);
SetRevision(rev);
}
示例6: UpdateData
void CExportDlg::OnBnClickedBrowse()
{
m_tooltips.Pop(); // hide the tooltips
SVNRev rev;
UpdateData();
if (GetCheckedRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N) == IDC_REVISION_HEAD)
{
rev = SVNRev::REV_HEAD;
}
else
rev = SVNRev(m_sRevision);
if (!rev.IsValid())
rev = SVNRev::REV_HEAD;
CAppUtils::BrowseRepository(m_URLCombo, this, rev);
SetRevision(rev);
DialogEnableWindow(IDOK, !m_strExportDirectory.IsEmpty());
}
示例7: SetRevision
void CCopyDlg::SetRevision(const SVNRev& rev)
{
if (rev.IsHead())
{
CheckRadioButton(IDC_COPYHEAD, IDC_COPYREV, IDC_COPYHEAD);
}
else if (rev.IsWorking())
{
CheckRadioButton(IDC_COPYHEAD, IDC_COPYREV, IDC_COPYWC);
}
else
{
CheckRadioButton(IDC_COPYHEAD, IDC_COPYREV, IDC_COPYREV);
CString temp;
temp.Format(L"%ld", (LONG)rev);
SetDlgItemText(IDC_COPYREVTEXT, temp);
}
}
示例8: SetRevision
void CExportDlg::SetRevision(const SVNRev& rev)
{
if (rev.IsHead())
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
else
{
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
CString sRev;
sRev.Format(L"%ld", (LONG)rev);
SetDlgItemText(IDC_REVISION_NUM, sRev);
}
}
示例9: PreUpdate
bool CHooks::PreUpdate(HWND hWnd, const CTSVNPathList& pathList, svn_depth_t depth, const SVNRev& rev, DWORD& exitcode, CString& error)
{
hookiterator it = FindItem(pre_update_hook, pathList);
if (it == end())
return false;
if (!ApproveHook(hWnd, it))
return false;
CString sCmd = it->second.commandline;
AddPathParam(sCmd, pathList);
AddDepthParam(sCmd, depth);
AddParam(sCmd, rev.ToString());
AddCWDParam(sCmd, pathList);
exitcode = RunScript(sCmd, pathList, error, it->second.bWait, it->second.bShow);
return true;
}
示例10: BlockResize
BOOL CEditPropExternalsValue::OnInitDialog()
{
CResizableStandAloneDialog::OnInitDialog();
CAppUtils::MarkWindowAsUnpinnable(m_hWnd);
BlockResize(DIALOG_BLOCKVERTICAL);
ExtendFrameIntoClientArea(IDC_GROUPBOTTOM);
m_aeroControls.SubclassOkCancelHelp(this);
m_sWCPath = m_External.targetDir;
SVNRev rev = m_External.revision;
SVNRev pegRev = SVNRev(m_External.pegrevision);
if ((pegRev.IsValid() && !pegRev.IsHead()) || (rev.IsValid() && !rev.IsHead()))
{
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_N);
if (m_External.revision.value.number == m_External.pegrevision.value.number)
{
m_sPegRev = pegRev.ToString();
}
else
{
m_sRevision = rev.ToString();
m_sPegRev = pegRev.ToString();
}
}
else
{
CheckRadioButton(IDC_REVISION_HEAD, IDC_REVISION_N, IDC_REVISION_HEAD);
}
m_URLCombo.LoadHistory(L"Software\\TortoiseSVN\\History\\repoURLS", L"url");
m_URLCombo.SetURLHistory(true, false);
m_URLCombo.SetWindowText(CPathUtils::PathUnescape(m_External.url));
UpdateData(false);
CString sWindowTitle;
GetWindowText(sWindowTitle);
CAppUtils::SetWindowTitle(m_hWnd, m_pathList.GetCommonRoot().GetUIPathString(), sWindowTitle);
AddAnchor(IDC_WCLABEL, TOP_LEFT);
AddAnchor(IDC_WCPATH, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_URLLABEL, TOP_LEFT);
AddAnchor(IDC_URLCOMBO, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_BROWSE, TOP_RIGHT);
AddAnchor(IDC_PEGLABEL, TOP_LEFT);
AddAnchor(IDC_OPERATIVELABEL, TOP_LEFT);
AddAnchor(IDC_PEGREV, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_GROUPBOTTOM, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_REVISION_HEAD, TOP_LEFT);
AddAnchor(IDC_REVISION_N, TOP_LEFT);
AddAnchor(IDC_REVISION_NUM, TOP_LEFT, TOP_RIGHT);
AddAnchor(IDC_SHOW_LOG, TOP_RIGHT);
AddAnchor(IDOK, BOTTOM_RIGHT);
AddAnchor(IDCANCEL, BOTTOM_RIGHT);
AddAnchor(IDHELP, BOTTOM_RIGHT);
EnableSaveRestore(L"EditPropExternalsValue");
return TRUE;
}
示例11: DiffProps
bool SVNDiff::DiffProps(const CTSVNPath& filePath, const SVNRev& rev1, const SVNRev& rev2, svn_revnum_t &baseRev) const
{
bool retvalue = false;
// diff the properties
SVNProperties propswc(filePath, rev1, false, false);
SVNProperties propsbase(filePath, rev2, false, false);
#define MAX_PATH_LENGTH 80
WCHAR pathbuf1[MAX_PATH] = {0};
if (filePath.GetWinPathString().GetLength() >= MAX_PATH)
{
std::wstring str = filePath.GetWinPath();
std::wregex rx(L"^(\\w+:|(?:\\\\|/+))((?:\\\\|/+)[^\\\\/]+(?:\\\\|/)[^\\\\/]+(?:\\\\|/)).*((?:\\\\|/)[^\\\\/]+(?:\\\\|/)[^\\\\/]+)$");
std::wstring replacement = L"$1$2...$3";
std::wstring str2 = std::regex_replace(str, rx, replacement);
if (str2.size() >= MAX_PATH)
str2 = str2.substr(0, MAX_PATH-2);
PathCompactPathEx(pathbuf1, str2.c_str(), MAX_PATH_LENGTH, 0);
}
else
PathCompactPathEx(pathbuf1, filePath.GetWinPath(), MAX_PATH_LENGTH, 0);
if ((baseRev == 0) && (!filePath.IsUrl()) && (rev1.IsBase() || rev2.IsBase()))
{
SVNStatus stat;
CTSVNPath dummy;
svn_client_status_t * s = stat.GetFirstFileStatus(filePath, dummy);
if (s)
baseRev = s->revision;
}
// check for properties that got removed
for (int baseindex = 0; baseindex < propsbase.GetCount(); ++baseindex)
{
std::string basename = propsbase.GetItemName(baseindex);
tstring basenameU = CUnicodeUtils::StdGetUnicode(basename);
tstring basevalue = (LPCTSTR)CUnicodeUtils::GetUnicode(propsbase.GetItemValue(baseindex).c_str());
bool bFound = false;
for (int wcindex = 0; wcindex < propswc.GetCount(); ++wcindex)
{
if (basename.compare (propswc.GetItemName(wcindex))==0)
{
bFound = true;
break;
}
}
if (!bFound)
{
// write the old property value to temporary file
CTSVNPath wcpropfile = CTempFiles::Instance().GetTempFilePath(false);
CTSVNPath basepropfile = CTempFiles::Instance().GetTempFilePath(false);
FILE * pFile;
_tfopen_s(&pFile, wcpropfile.GetWinPath(), L"wb");
if (pFile)
{
fclose(pFile);
FILE * pFile2;
_tfopen_s(&pFile2, basepropfile.GetWinPath(), L"wb");
if (pFile2)
{
fputs(CUnicodeUtils::StdGetUTF8(basevalue).c_str(), pFile2);
fclose(pFile2);
}
else
return false;
}
else
return false;
SetFileAttributes(wcpropfile.GetWinPath(), FILE_ATTRIBUTE_READONLY);
SetFileAttributes(basepropfile.GetWinPath(), FILE_ATTRIBUTE_READONLY);
CString n1, n2;
bool bSwitch = false;
if (rev1.IsWorking())
n1.Format(IDS_DIFF_PROP_WCNAME, basenameU.c_str());
if (rev1.IsBase())
{
if (baseRev)
n1.FormatMessage(IDS_DIFF_PROP_BASENAMEREV, basenameU.c_str(), baseRev);
else
n1.Format(IDS_DIFF_PROP_BASENAME, basenameU.c_str());
}
if (rev1.IsHead())
n1.Format(IDS_DIFF_PROP_REMOTENAME, basenameU.c_str());
if (n1.IsEmpty())
{
CString temp;
temp.Format(IDS_DIFF_REVISIONPATCHED, (LONG)rev1);
n1 = basenameU.c_str();
n1 += L" " + temp;
bSwitch = true;
}
else
{
n1 = CString(pathbuf1) + L" - " + n1;
}
if (rev2.IsWorking())
n2.Format(IDS_DIFF_PROP_WCNAME, basenameU.c_str());
if (rev2.IsBase())
{
if (baseRev)
n2.FormatMessage(IDS_DIFF_PROP_BASENAMEREV, basenameU.c_str(), baseRev);
//.........这里部分代码省略.........
示例12: CString
bool SVNDiff::ShowCompare( const CTSVNPath& url1, const SVNRev& rev1, const CTSVNPath& url2, const SVNRev& rev2, SVNRev peg, bool ignoreprops, const CString& options, bool ignoreancestry /*= false*/, bool blame /*= false*/, svn_node_kind_t nodekind /*= svn_node_unknown*/ )
{
CTSVNPath tempfile;
CString mimetype;
CProgressDlg progDlg;
progDlg.SetTitle(IDS_APPNAME);
progDlg.SetTime(false);
m_pSVN->SetAndClearProgressInfo(&progDlg);
CAppUtils::DiffFlags diffFlags;
diffFlags.ReadOnly().AlternativeTool(m_bAlternativeTool);
if ((m_pSVN->PathIsURL(url1))||(!rev1.IsWorking())||(!url1.IsEquivalentTo(url2)))
{
// no working copy path!
progDlg.ShowModeless(GetHWND());
tempfile = CTempFiles::Instance().GetTempFilePath(false, url1);
// first find out if the url points to a file or dir
CString sRepoRoot;
if ((nodekind != svn_node_dir)&&(nodekind != svn_node_file))
{
progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PROGRESS_INFO)));
SVNInfo info;
const SVNInfoData * data = info.GetFirstFileInfo(url1, (peg.IsValid() ? peg : m_headPeg), rev1, svn_depth_empty);
if (data == NULL)
{
data = info.GetFirstFileInfo(url1, (peg.IsValid() ? peg : rev1), rev1, svn_depth_empty);
if (data == NULL)
{
data = info.GetFirstFileInfo(url1, (peg.IsValid() ? peg : rev2), rev1, svn_depth_empty);
if (data == NULL)
{
progDlg.Stop();
m_pSVN->SetAndClearProgressInfo((HWND)NULL);
info.ShowErrorDialog(GetHWND());
return false;
}
else
{
sRepoRoot = data->reposRoot;
nodekind = data->kind;
peg = peg.IsValid() ? peg : rev2;
}
}
else
{
sRepoRoot = data->reposRoot;
nodekind = data->kind;
peg = peg.IsValid() ? peg : rev1;
}
}
else
{
sRepoRoot = data->reposRoot;
nodekind = data->kind;
peg = peg.IsValid() ? peg : m_headPeg;
}
}
else
{
sRepoRoot = m_pSVN->GetRepositoryRoot(url1);
peg = peg.IsValid() ? peg : m_headPeg;
}
if (nodekind == svn_node_dir)
{
if (rev1.IsWorking())
{
if (UnifiedDiff(tempfile, url1, rev1, url2, rev2, (peg.IsValid() ? peg : SVNRev::REV_WC), options))
{
CString sWC;
sWC.LoadString(IDS_DIFF_WORKINGCOPY);
progDlg.Stop();
m_pSVN->SetAndClearProgressInfo((HWND)NULL);
return !!CAppUtils::StartExtPatch(tempfile, url1.GetDirectory(), sWC, url2.GetSVNPathString(), TRUE);
}
}
else
{
progDlg.Stop();
m_pSVN->SetAndClearProgressInfo((HWND)NULL);
CFileDiffDlg fdlg;
fdlg.DoBlame(blame);
if (url1.IsEquivalentTo(url2))
{
fdlg.SetDiff(url1, (peg.IsValid() ? peg : m_headPeg), rev1, rev2, svn_depth_infinity, ignoreancestry);
fdlg.DoModal();
}
else
{
fdlg.SetDiff(url1, rev1, url2, rev2, svn_depth_infinity, ignoreancestry);
fdlg.DoModal();
}
}
}
else
{
if (url1.IsEquivalentTo(url2) && !ignoreprops)
{
svn_revnum_t baseRev = 0;
DiffProps(url1, rev2, rev1, baseRev);
//.........这里部分代码省略.........
示例13: CTSVNPath
bool SVNDiff::UnifiedDiff(CTSVNPath& tempfile, const CTSVNPath& url1, const SVNRev& rev1, const CTSVNPath& url2, const SVNRev& rev2, const SVNRev& peg, const CString& options, bool bIgnoreAncestry /* = false */, bool bIgnoreProperties /* = true */)
{
tempfile = CTempFiles::Instance().GetTempFilePath(m_bRemoveTempFiles, CTSVNPath(L"Test.diff"));
bool bIsUrl = !!SVN::PathIsURL(url1);
CProgressDlg progDlg;
progDlg.SetTitle(IDS_APPNAME);
progDlg.SetLine(1, CString(MAKEINTRESOURCE(IDS_PROGRESS_UNIFIEDDIFF)));
progDlg.SetTime(false);
m_pSVN->SetAndClearProgressInfo(&progDlg);
progDlg.ShowModeless(GetHWND());
// find the root of the files
CTSVNPathList plist;
plist.AddPath(url1);
plist.AddPath(url2);
CTSVNPath relativeTo = plist.GetCommonRoot();
if (!relativeTo.IsUrl())
{
if (!relativeTo.IsDirectory())
relativeTo = relativeTo.GetContainingDirectory();
}
if (relativeTo.IsEmpty() && url1.Exists() && url2.IsUrl())
{
// the source path exists, i.e. it's a local path, so
// use this as the relative url
relativeTo = url1.GetDirectory();
}
// the 'relativeTo' path must be a path: svn throws an error if it's used for urls.
else if ((!url2.IsEquivalentTo(url1) && (relativeTo.IsEquivalentTo(url1) || relativeTo.IsEquivalentTo(url2))) || url1.IsUrl() || url2.IsUrl())
relativeTo.Reset();
if ((!url1.IsEquivalentTo(url2))||((rev1.IsWorking() || rev1.IsBase())&&(rev2.IsWorking() || rev2.IsBase())))
{
if (!m_pSVN->Diff(url1, rev1, url2, rev2, relativeTo, svn_depth_infinity, true, false, false, false, false, false, bIgnoreProperties, false, options, bIgnoreAncestry, tempfile))
{
progDlg.Stop();
m_pSVN->SetAndClearProgressInfo((HWND)NULL);
m_pSVN->ShowErrorDialog(GetHWND());
return false;
}
}
else
{
if (!m_pSVN->PegDiff(url1, (peg.IsValid() ? peg : (bIsUrl ? m_headPeg : SVNRev::REV_WC)), rev1, rev2, relativeTo, svn_depth_infinity, true, false, false, false, false, false, bIgnoreProperties, false, options, false, tempfile))
{
if (!m_pSVN->Diff(url1, rev1, url2, rev2, relativeTo, svn_depth_infinity, true, false, false, false, false, false, bIgnoreProperties, false, options, false, tempfile))
{
progDlg.Stop();
m_pSVN->SetAndClearProgressInfo((HWND)NULL);
m_pSVN->ShowErrorDialog(GetHWND());
return false;
}
}
}
if (CAppUtils::CheckForEmptyDiff(tempfile))
{
progDlg.Stop();
m_pSVN->SetAndClearProgressInfo((HWND)NULL);
TaskDialog(GetHWND(), AfxGetResourceHandle(), MAKEINTRESOURCE(IDS_APPNAME), MAKEINTRESOURCE(IDS_ERR_ERROROCCURED), MAKEINTRESOURCE(IDS_ERR_EMPTYDIFF), TDCBF_OK_BUTTON, TD_ERROR_ICON, NULL);
return false;
}
progDlg.Stop();
m_pSVN->SetAndClearProgressInfo((HWND)NULL);
return true;
}
示例14: svn_error_clear
bool CFullHistory::FetchRevisionData ( CString path
, SVNRev pegRev
, bool showWCRev
, bool showWCModification
, CProgressDlg* progress
, ITaskbarList3 * pTaskBarList
, HWND hWnd)
{
// clear any previously existing SVN error info
svn_error_clear(Err);
Err = NULL;
// remove internal data from previous runs
CFuture<bool> clearJob (this, &CFullHistory::ClearCopyInfo, &cpuLoadScheduler);
// set some text on the progress dialog, before we wait
// for the log operation to start
this->progress = progress;
this->taskbarlist = pTaskBarList;
this->hwnd = hWnd;
CString temp;
temp.LoadString (IDS_REVGRAPH_PROGGETREVS);
progress->SetLine(1, temp);
temp.LoadString (IDS_REVGRAPH_PROGPREPARING);
progress->SetLine(2, temp);
progress->SetProgress(0, 1);
progress->ShowModeless (hWnd);
if (taskbarlist)
{
taskbarlist->SetProgressState(hwnd, TBPF_INDETERMINATE);
}
// prepare the path for Subversion
CTSVNPath svnPath (path);
CStringA url = CPathUtils::PathEscape
(CUnicodeUtils::GetUTF8
(svn.GetURLFromPath (svnPath)));
// we have to get the log from the repository root
CTSVNPath rootPath;
svn_revnum_t head;
if (FALSE == svn.GetRootAndHead (svnPath, rootPath, head))
{
Err = svn_error_dup(const_cast<svn_error_t*>(svn.GetSVNError()));
return false;
}
if (pegRev.IsHead())
pegRev = head;
headRevision = head;
CString escapedRepoRoot = rootPath.GetSVNPathString();
relPath = CPathUtils::PathUnescape (url.Mid (escapedRepoRoot.GetLength()));
repoRoot = CPathUtils::PathUnescape (escapedRepoRoot);
// fix issue #360: use WC revision as peg revision
pegRevision = pegRev;
if (pegRevision == NO_REVISION)
{
if (!svnPath.IsUrl())
{
SVNInfo info;
const SVNInfoData * baseInfo
= info.GetFirstFileInfo (svnPath, SVNRev(), SVNRev());
if (baseInfo != NULL)
pegRevision = baseInfo->rev;
}
}
// fetch missing data from the repository
try
{
// select / construct query object and optimize revision range to fetch
svnQuery.reset (new CSVNLogQuery (ctx, pool));
bool cacheIsComplete = false;
if (svn.GetLogCachePool()->IsEnabled())
{
CLogCachePool* pool = svn.GetLogCachePool();
query.reset (new CCacheLogQuery (pool, svnQuery.get()));
// get the cache and the lowest missing revision
// (in off-line mode, the query may not find the cache as
// it cannot contact the server to get the UUID)
uuid = pool->GetRepositoryInfo().GetRepositoryUUID (rootPath);
cache = pool->GetCache (uuid, escapedRepoRoot);
firstRevision = cache != NULL
? cache->GetRevisions().GetFirstMissingRevision(1)
: 0;
// if the cache is already complete, the firstRevision here is
//.........这里部分代码省略.........