# HG changeset patch
# User Adrian Buehlmann <[email protected]>
# Date 1251059251 -7200
# Branch stable
# Node ID cf22d3d5fe1adcc7bc9b649991154f7ce3cc1b4a
# Parent 2e318553be7e491132544e0c4ec9976047423a47
shellext: QueryDirstate: don't show icons on repo roots for UNC paths
This reduces the number of PathIsDirectory calls to a single call per
navigation into a non-repo subfolder on network shares.
See Issue508 for some motivation for this change.
diff --git a/win32/shellext/QueryDirstate.cpp b/win32/shellext/QueryDirstate.cpp
--- a/win32/shellext/QueryDirstate.cpp
+++ b/win32/shellext/QueryDirstate.cpp
@@ -45,29 +45,53 @@ public:
bool hasHgDir(const std::string& path)
{
- return PathIsDirectory((path + "\\.hg").c_str()) != 0;
+ bool res = false;
+
+ if (path.empty() || path == "\\" || PathIsRoot(path.c_str()))
+ {
+ TDEBUG_TRACE(
+ "hasHgDir(\"" << path << "\") -> " << res
+ );
+ return res;
+ }
+
+ const std::string p = path + "\\.hg";
+ res = PathIsDirectory(p.c_str()) != 0;
+ TDEBUG_TRACE(
+ "hasHgDir: PathIsDirectory(\"" << p << "\") -> " << res
+ );
+ return res;
}
int findHgRoot(QueryState& cur, QueryState& last, bool outdated)
{
- if (cur.isdir)
+ if (!PathIsNetworkPath(cur.path.c_str()))
{
- std::string p = cur.path;
- p.push_back('\\');
- if (p.find(".hg\\") != std::string::npos)
+ cur.isdir = PathIsDirectory(cur.path.c_str());
+ TDEBUG_TRACE(
+ "findHgRoot: PathIsDirectory(\"" << cur.path
+ << "\") -> " << cur.isdir
+ );
+
+ if (cur.isdir)
{
- //TDEBUG_TRACE("findHgRoot: skipping '" << cur.path << "'");
- last = cur;
- return 0;
+ std::string p = cur.path;
+ p.push_back('\\');
+ if (p.find(".hg\\") != std::string::npos)
+ {
+ //TDEBUG_TRACE("findHgRoot: skipping '" << cur.path << "'");
+ last = cur;
+ return 0;
+ }
}
- }
- if (cur.isdir && hasHgDir(cur.path))
- {
- cur.hgroot = cur.path;
- TDEBUG_TRACE("findHgRoot(" << cur.path << "): hgroot = cur.path");
- return 1;
+ if (cur.isdir && hasHgDir(cur.path))
+ {
+ cur.hgroot = cur.path;
+ TDEBUG_TRACE("findHgRoot(" << cur.path << "): hgroot = cur.path");
+ return 1;
+ }
}
cur.basedir = DirName(cur.path);
@@ -150,8 +174,6 @@ int HgQueryDirstate(
return 0;
}
- cur.isdir = PathIsDirectory(cur.path.c_str());
-
if (findHgRoot(cur, last, outdated) == 0)
return 0;
@@ -184,81 +206,76 @@ int HgQueryDirstate(
bool unset = false;
+ Dirstate* pds = Dirstatecache::get(cur.hgroot, cur.basedir, unset);
+ if (!pds)
+ {
+ TDEBUG_TRACE("HgQueryDirstate: Dirstatecache::get("
+ << cur.hgroot << ") returns no Dirstate");
+ last = cur;
+ return 0;
+ }
+
+ Winstat stat;
+ if (0 != stat.lstat(path.c_str()))
+ {
+ TDEBUG_TRACE("HgQueryDirstate: lstat(" << path << ") failed");
+ last = cur;
+ return 0;
+ }
+ cur.isdir = stat.isdir;
+ TDEBUG_TRACE(
+ "HgQueryDirstate: stat.lstat(\"" << cur.path
+ << "\") -> stat.isdir is " << stat.isdir
+ );
+
if (cur.isdir)
{
- if (!relpath.empty())
+ if (!relpath.empty() && !pds->root().getdir(relpath))
{
- Dirstate* pds2 = Dirstatecache::get(cur.hgroot, cur.basedir,
unset);
- if (pds2 && !pds2->root().getdir(relpath))
- {
- last = cur;
- return 0; // unknown dir -> no icon
- }
+ last = cur;
+ return 0; // unknown dir -> no icon
}
outStatus = (pdirsta ? pdirsta->status(relpath) : '?');
+ cur.status = outStatus;
+ cur.tickcount = GetTickCount();
+ last = cur;
+ return 1;
}
- else
+
+ const Direntry* const e = pds->root().get(relpath);
+ if (!e)
{
- Dirstate* pds = Dirstatecache::get(cur.hgroot, cur.basedir, unset);
- if (!pds)
+ last = cur;
+ return 0;
+ }
+
+ outStatus = e->status(stat);
+
+ if (outStatus == 'M' && pdirsta)
+ {
+ std::string relbase;
+ if (get_relpath(cur.hgroot, cur.basedir, relbase))
{
- TDEBUG_TRACE("HgQueryDirstate: Dirstatecache::get("
- << cur.hgroot << ") returns no Dirstate");
- last = cur;
- return 0;
- }
+ TDEBUG_TRACE("HgQueryDirstate: relbase = '"
+ << relbase << "'");
- if (filterStatus == 'A' && pds->num_added() == 0) {
- // don't store QueryState
- return 0;
- }
+ char basedir_status = pdirsta->status(relbase);
+ TDEBUG_TRACE("HgQueryDirstate: basedir_status = "
+ << basedir_status);
- const Direntry* e = pds->root().get(relpath);
- if (!e) {
- last = cur;
- return 0;
- }
-
- Winstat stat;
- if (0 != stat.lstat(path.c_str())) {
- TDEBUG_TRACE("HgQueryDirstate: lstat(" << path << ") failed");
- last = cur;
- return 0;
- }
-
- outStatus = e->status(stat);
-
- if (outStatus == 'M')
- {
- DirectoryStatus* dirsst =
- DirectoryStatus::get(cur.hgroot, cur.basedir);
- if (dirsst)
+ if (basedir_status != 'M')
{
- std::string relbase;
- if (get_relpath(cur.hgroot, cur.basedir, relbase))
+ if (unset)
{
- TDEBUG_TRACE("HgQueryDirstate: relbase = '"
- << relbase << "'");
-
- char basedir_status = dirsst->status(relbase);
- TDEBUG_TRACE("HgQueryDirstate: basedir_status = "
- << basedir_status);
-
- if (basedir_status != 'M')
- {
- if (unset)
- {
- TDEBUG_TRACE(
- "HgQueryDirstate: omitting Thgstatus::update");
- }
- else
- {
- TDEBUG_TRACE(
- "HgQueryDirstate: calling Thgstatus::update");
- Thgstatus::update(cur.hgroot);
- }
- }
+ TDEBUG_TRACE(
+ "HgQueryDirstate: omitting Thgstatus::update");
+ }
+ else
+ {
+ TDEBUG_TRACE(
+ "HgQueryDirstate: calling Thgstatus::update");
+ Thgstatus::update(cur.hgroot);
}
}
}
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Tortoisehg-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop