-// ToroiseGit - a Windows shell extension for easy version control\r
+// TortoiseGit - a Windows shell extension for easy version control\r
\r
// Copyright (C) 2003-2008 - Stefan Kueng\r
\r
#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
- cachetype = CRegStdWORD(_T("Software\\ToroiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? dll : exe);\r
- showrecursive = CRegStdWORD(_T("Software\\ToroiseGit\\RecursiveOverlay"), TRUE);\r
- folderoverlay = CRegStdWORD(_T("Software\\ToroiseGit\\FolderOverlay"), TRUE);\r
- driveremote = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskRemote"));\r
- drivefixed = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskFixed"), TRUE);\r
- drivecdrom = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskCDROM"));\r
- driveremove = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskRemovable"));\r
- drivefloppy = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskFloppy"));\r
- driveram = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskRAM"));\r
- driveunknown = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskUnknown"));\r
- excludelist = CRegStdString(_T("Software\\ToroiseGit\\OverlayExcludeList"));\r
- includelist = CRegStdString(_T("Software\\ToroiseGit\\OverlayIncludeList"));\r
- simplecontext = CRegStdWORD(_T("Software\\ToroiseGit\\SimpleContext"), FALSE);\r
- unversionedasmodified = CRegStdWORD(_T("Software\\ToroiseGit\\UnversionedAsModified"), FALSE);\r
- showunversionedoverlay = CRegStdWORD(_T("Software\\ToroiseGit\\ShowUnversionedOverlay"), TRUE);\r
- showignoredoverlay = CRegStdWORD(_T("Software\\ToroiseGit\\ShowIgnoredOverlay"), TRUE);\r
- getlocktop = CRegStdWORD(_T("Software\\ToroiseGit\\GetLockTop"), TRUE);\r
- excludedasnormal = CRegStdWORD(_T("Software\\ToroiseGit\\ShowExcludedAsNormal"), TRUE);\r
+ cachetype = CRegStdWORD(_T("Software\\TortoiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? dll : exe);\r
+ showrecursive = CRegStdWORD(_T("Software\\TortoiseGit\\RecursiveOverlay"), TRUE);\r
+ folderoverlay = CRegStdWORD(_T("Software\\TortoiseGit\\FolderOverlay"), TRUE);\r
+ driveremote = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskRemote"));\r
+ drivefixed = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskFixed"), TRUE);\r
+ drivecdrom = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskCDROM"));\r
+ driveremove = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskRemovable"));\r
+ drivefloppy = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskFloppy"));\r
+ driveram = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskRAM"));\r
+ driveunknown = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskUnknown"));\r
+ excludelist = CRegStdString(_T("Software\\TortoiseGit\\OverlayExcludeList"));\r
+ includelist = CRegStdString(_T("Software\\TortoiseGit\\OverlayIncludeList"));\r
+ simplecontext = CRegStdWORD(_T("Software\\TortoiseGit\\SimpleContext"), FALSE);\r
+ unversionedasmodified = CRegStdWORD(_T("Software\\TortoiseGit\\UnversionedAsModified"), FALSE);\r
+ showunversionedoverlay = CRegStdWORD(_T("Software\\TortoiseGit\\ShowUnversionedOverlay"), TRUE);\r
+ showignoredoverlay = CRegStdWORD(_T("Software\\TortoiseGit\\ShowIgnoredOverlay"), TRUE);\r
+ getlocktop = CRegStdWORD(_T("Software\\TortoiseGit\\GetLockTop"), TRUE);\r
+ excludedasnormal = CRegStdWORD(_T("Software\\TortoiseGit\\ShowExcludedAsNormal"), TRUE);\r
cachetypeticker = GetTickCount();\r
recursiveticker = cachetypeticker;\r
folderoverlayticker = cachetypeticker;\r
getlocktopticker = cachetypeticker;\r
excludedasnormalticker = cachetypeticker;\r
excontextticker = cachetypeticker;\r
- menulayoutlow = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntries"), MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT);\r
- menulayouthigh = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntrieshigh"), (MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT)>>32);\r
- menumasklow_lm = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskLow"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
- menumaskhigh_lm = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskHigh"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
- menumasklow_cu = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskLow"), 0);\r
- menumaskhigh_cu = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskHigh"), 0);\r
- langid = CRegStdWORD(_T("Software\\ToroiseGit\\LanguageID"), 1033);\r
- blockstatus = CRegStdWORD(_T("Software\\ToroiseGit\\BlockStatus"), 0);\r
- columnseverywhere = CRegStdWORD(_T("Software\\ToroiseGit\\ColumnsEveryWhere"), FALSE);\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
+ menumaskhigh_cu = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskHigh"), 0);\r
+ langid = CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033);\r
+ blockstatus = CRegStdWORD(_T("Software\\TortoiseGit\\BlockStatus"), 0);\r
+ columnseverywhere = CRegStdWORD(_T("Software\\TortoiseGit\\ColumnsEveryWhere"), FALSE);\r
for (int i=0; i<27; i++)\r
{\r
drivetypecache[i] = (UINT)-1;\r
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, &szBuffer[0], sizeof(szBuffer));\r
columnrevformat.NegativeOrder = _ttoi(szBuffer);\r
sAdminDirCacheKey.reserve(MAX_PATH); // MAX_PATH as buffer reservation ok.\r
- nocontextpaths = CRegStdString(_T("Software\\ToroiseGit\\NoContextPaths"), _T(""));\r
+ nocontextpaths = CRegStdString(_T("Software\\TortoiseGit\\NoContextPaths"), _T(""));\r
m_critSec.Init();\r
}\r
void ForceRefresh()\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