OSDN Git Service

BrowseRefs: Save / Restore window size
[tortoisegit/TortoiseGitJp.git] / src / TortoiseShell / ShellCache.h
index 341491d..bfeb944 100644 (file)
@@ -20,6 +20,7 @@
 #include "registry.h"\r
 #include "Globals.h"\r
 #include "GitAdminDir.h"\r
+#include "Git.h"\r
 \r
 #define REGISTRYTIMEOUT 2000\r
 #define EXCLUDELISTTIMEOUT 5000\r
@@ -42,7 +43,8 @@ public:
        {\r
                none,\r
                exe,\r
-               dll\r
+               dll,\r
+               dllFull,// same as dll except it uses commandline git tool with all status modes supported\r
        };\r
        ShellCache()\r
        {\r
@@ -82,8 +84,8 @@ public:
                getlocktopticker = cachetypeticker;\r
                excludedasnormalticker = cachetypeticker;\r
                excontextticker = cachetypeticker;\r
-               menulayoutlow = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntries"),              MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT);\r
-               menulayouthigh = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntrieshigh"), (MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT)>>32);\r
+               menulayoutlow = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntries"),              MENUCREATEREPOS|MENUCLONE|MENUCOMMIT);\r
+               menulayouthigh = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntrieshigh"), (MENUCREATEREPOS|MENUCLONE|MENUCOMMIT)>>32);\r
                menumasklow_lm = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskLow"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
                menumaskhigh_lm = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskHigh"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
                menumasklow_cu = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskLow"), 0);\r
@@ -435,7 +437,7 @@ public:
                }\r
                return &columnrevformat;\r
        }\r
-       BOOL HasSVNAdminDir(LPCTSTR path, BOOL bIsDir)\r
+       BOOL HasSVNAdminDir(LPCTSTR path, BOOL bIsDir, CString *ProjectTopDir = NULL)\r
        {\r
                size_t len = _tcslen(path);\r
                TCHAR * buf = new TCHAR[len+1];\r
@@ -450,18 +452,31 @@ public:
                }\r
                if ((GetTickCount() - ADMINDIRTIMEOUT) < admindirticker)\r
                {\r
-                       std::map<stdstring, BOOL>::iterator iter;\r
+                       std::map<stdstring, AdminDir_s>::iterator iter;\r
                        sAdminDirCacheKey.assign(buf);\r
                        if ((iter = admindircache.find(sAdminDirCacheKey)) != admindircache.end())\r
                        {\r
                                delete [] buf;\r
-                               return iter->second;\r
+                               if (ProjectTopDir && iter->second.bHasAdminDir)\r
+                                       *ProjectTopDir = iter->second.sProjectRoot.c_str();\r
+                               return iter->second.bHasAdminDir;\r
                        }\r
                }\r
-               BOOL hasAdminDir = g_GitAdminDir.HasAdminDir(buf, true);\r
+               CString sProjectRoot;\r
+               BOOL hasAdminDir = g_GitAdminDir.HasAdminDir(buf, true, &sProjectRoot);\r
                admindirticker = GetTickCount();\r
                Locker lock(m_critSec);\r
-               admindircache[buf] = hasAdminDir;\r
+\r
+               AdminDir_s &ad = admindircache[buf];\r
+               ad.bHasAdminDir = hasAdminDir;\r
+               if (hasAdminDir)\r
+               {\r
+                       ad.sProjectRoot.assign(sProjectRoot);\r
+\r
+                       if (ProjectTopDir)\r
+                               *ProjectTopDir = sProjectRoot;\r
+               }\r
+\r
                delete [] buf;\r
                return hasAdminDir;\r
        }\r
@@ -568,6 +583,13 @@ private:
                        includeliststr = (stdstring)includelist;\r
                }\r
        }\r
+\r
+       struct AdminDir_s\r
+       {\r
+               BOOL bHasAdminDir;\r
+               stdstring sProjectRoot;\r
+       };\r
+\r
        CRegStdWORD cachetype;\r
        CRegStdWORD blockstatus;\r
        CRegStdWORD langid;\r
@@ -623,7 +645,7 @@ private:
        NUMBERFMT columnrevformat;\r
        TCHAR szDecSep[5];\r
        TCHAR szThousandsSep[5];\r
-       std::map<stdstring, BOOL> admindircache;\r
+       std::map<stdstring, AdminDir_s> admindircache;\r
        stdstring sAdminDirCacheKey;\r
        CRegStdString nocontextpaths;\r
        stdstring excludecontextstr;\r