#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
{\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
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
}\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
}\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
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
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