OSDN Git Service

made wingit.dll delay load so that PATH can be inited with git/bin dir before dll...
authorMyagi <snowcoder@gmail.com>
Mon, 26 Jan 2009 06:36:43 +0000 (07:36 +0100)
committerFrank Li <lznuaa@gmail.com>
Wed, 28 Jan 2009 03:14:39 +0000 (11:14 +0800)
src/Git/Git.cpp
src/Git/Git.vcproj
src/TGitCache/TSVNCache.vcproj
src/TortoiseGitBlame/TortoiseGitBlame.vcproj
src/TortoiseProc/TortoiseProc.vcproj
src/TortoiseShell/TortoiseShell.vcproj

index 10cb7fb..f9b5278 100644 (file)
@@ -6,6 +6,108 @@
 #include "GitConfig.h"\r
 \r
 \r
+static LPTSTR nextpath(LPCTSTR src, LPTSTR dst, UINT maxlen)\r
+{\r
+       LPCTSTR orgsrc;\r
+\r
+       while (*src == _T(';'))\r
+               src++;\r
+\r
+       orgsrc = src;\r
+\r
+       if (!--maxlen)\r
+               goto nullterm;\r
+\r
+       while (*src && *src != _T(';'))\r
+       {\r
+               if (*src != _T('"'))\r
+               {\r
+                       *dst++ = *src++;\r
+                       if (!--maxlen)\r
+                       {\r
+                               orgsrc = src;\r
+                               goto nullterm;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       src++;\r
+                       while (*src && *src != _T('"'))\r
+                       {\r
+                               *dst++ = *src++;\r
+                               if (!--maxlen)\r
+                               {\r
+                                       orgsrc = src;\r
+                                       goto nullterm;\r
+                               }\r
+                       }\r
+\r
+                       if (*src)\r
+                               src++;\r
+               }\r
+       }\r
+\r
+       while (*src == _T(';'))\r
+               src++;\r
+\r
+nullterm:\r
+\r
+       *dst = 0;\r
+\r
+       return (orgsrc != src) ? (LPTSTR)src : NULL;\r
+}\r
+\r
+static inline BOOL FileExists(LPCTSTR lpszFileName)\r
+{\r
+       struct _stat st;\r
+       return _tstat(lpszFileName, &st) == 0;\r
+}\r
+\r
+static BOOL FindGitPath()\r
+{\r
+       size_t size;\r
+       _tgetenv_s(&size, NULL, 0, _T("PATH"));\r
+\r
+       if (!size)\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       TCHAR *env = (TCHAR*)alloca(size);\r
+       _tgetenv_s(&size, env, size, _T("PATH"));\r
+\r
+       TCHAR buf[_MAX_PATH];\r
+\r
+       const LPCTSTR filename = _T("git.exe");\r
+       const int filelen = _tcslen(filename);\r
+\r
+       // search in all paths defined in PATH\r
+       while ((env = nextpath(env, buf, _MAX_PATH-1)) && *buf)\r
+       {\r
+               TCHAR *pfin = buf + _tcslen(buf)-1;\r
+\r
+               // ensure trailing slash\r
+               if (*pfin != '/' && *pfin != '\\')\r
+                       _tccpy(pfin+1, _T("\\"));\r
+\r
+               const int len = _tcslen(buf);\r
+\r
+               if ((len + filelen) < _MAX_PATH)\r
+                       _tccpy(buf+len, filename);\r
+               else\r
+                       break;\r
+\r
+               if ( FileExists(buf) )\r
+               {\r
+                       // dir found\r
+                       return TRUE;\r
+               }\r
+       }\r
+\r
+       return FALSE;\r
+}\r
+\r
+\r
 #define MAX_DIRBUFFER 1000\r
 CString CGit::ms_LastMsysGitDir;\r
 CGit g_Git;\r
@@ -13,6 +115,12 @@ CGit::CGit(void)
 {\r
        GetCurrentDirectory(MAX_DIRBUFFER,m_CurrentDir.GetBuffer(MAX_DIRBUFFER));\r
 \r
+       // make sure git/bin is in PATH before wingit.dll gets (delay) loaded by wgInit()\r
+       if ( !CheckMsysGitDir() )\r
+       {\r
+               // TODO\r
+       }\r
+\r
        if ( !wgInit() )\r
        {\r
                // TODO\r
@@ -510,6 +618,34 @@ int CGit::GetMapHashToFriendName(MAP_HASH_NAME &map)
 \r
 BOOL CGit::CheckMsysGitDir()\r
 {\r
+       static BOOL bInitialized = FALSE;\r
+\r
+       if (bInitialized)\r
+       {\r
+               return TRUE;\r
+       }\r
+\r
+       TCHAR *oldpath,*home;\r
+       size_t size;\r
+\r
+       // set HOME if not set already\r
+       _tgetenv_s(&size, NULL, 0, _T("HOME"));\r
+       if (!size)\r
+       {\r
+               _tdupenv_s(&home,&size,_T("USERPROFILE")); \r
+               _tputenv_s(_T("HOME"),home);\r
+               free(home);\r
+       }\r
+\r
+       // search PATH if git/bin directory is alredy present\r
+       if ( FindGitPath() )\r
+       {\r
+               bInitialized = TRUE;\r
+               return TRUE;\r
+       }\r
+\r
+       // add git/bin path to PATH\r
+\r
        CRegString msysdir=CRegString(REG_MSYSGIT_PATH,_T(""),FALSE,HKEY_LOCAL_MACHINE);\r
        CString str=msysdir;\r
        if(str.IsEmpty())\r
@@ -528,19 +664,8 @@ BOOL CGit::CheckMsysGitDir()
        }\r
        //CGit::m_MsysGitPath=str;\r
 \r
-       TCHAR *oldpath,*home;\r
-       size_t size;\r
-\r
-       _tdupenv_s(&home,&size,_T("HOME")); \r
-       \r
-       if(home == NULL)\r
-       {               \r
-               _tdupenv_s(&home,&size,_T("USERPROFILE")); \r
-               _tputenv_s(_T("HOME"),home);\r
-       }\r
-       free(home);\r
-       \r
        //set path\r
+\r
        _tdupenv_s(&oldpath,&size,_T("PATH")); \r
 \r
        CString path;\r
@@ -569,13 +694,13 @@ BOOL CGit::CheckMsysGitDir()
        }\r
        free(oldpath);\r
 \r
-       CString cmd,out;\r
-       cmd=_T("git.exe --version");\r
-       if(g_Git.Run(cmd,&out,CP_UTF8))\r
+       if( !FindGitPath() )\r
        {\r
                return false;\r
        }\r
        else\r
+       {\r
+               bInitialized = TRUE;\r
                return true;\r
-\r
+       }\r
 }
\ No newline at end of file
index 803176e..b990dc2 100644 (file)
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               AdditionalDependencies="wingit.lib"\r
-                               AdditionalLibraryDirectories="../../ext/wingit"\r
+                               AdditionalLibraryDirectories=""\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
index e6ee44c..da24fc1 100644 (file)
@@ -77,6 +77,7 @@
                                LinkIncremental="2"\r
                                AdditionalLibraryDirectories="../../ext/wingit"\r
                                IgnoreDefaultLibraryNames="libc"\r
+                               DelayLoadDLLs="wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                ProgramDatabaseFile="$(OutDir)/TGitCache.pdb"\r
                                SubSystem="2"\r
                                OutputFile="$(OutDir)/TGitCache.exe"\r
                                LinkIncremental="1"\r
                                AdditionalLibraryDirectories="../../ext/wingit"\r
+                               DelayLoadDLLs="wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="2"\r
                                OptimizeReferences="2"\r
index 2be27be..9be60fc 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="gb2312"?>\r
 <VisualStudioProject\r
        ProjectType="Visual C++"\r
-       Version="9.00"\r
+       Version="9,00"\r
        Name="TortoiseGitBlame"\r
        ProjectGUID="{62507C2F-9290-4342-910F-BFC44DF99B01}"\r
        RootNamespace="TortoiseGitBlame"\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib"\r
+                               AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib wingit.lib"\r
                                LinkIncremental="2"\r
+                               AdditionalLibraryDirectories="../../ext/wingit"\r
                                IgnoreDefaultLibraryNames="LIBCMTD"\r
+                               DelayLoadDLLs="wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="2"\r
                                TargetMachine="1"\r
                        />\r
                        <Tool\r
                                Name="VCLinkerTool"\r
-                               AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib"\r
+                               AdditionalDependencies="Crypt32.lib gdiplus.lib shfolder.lib shell32.lib comctl32.lib ws2_32.lib rpcrt4.lib shlwapi.lib wininet.lib version.lib wingit.lib"\r
                                LinkIncremental="1"\r
+                               AdditionalLibraryDirectories="../../ext/wingit"\r
+                               DelayLoadDLLs="wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="2"\r
                                OptimizeReferences="2"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\res\output_wnd.ico"\r
+                               RelativePath="..\Resources\blameres\output_wnd.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\blameres\output_wnd.ico"\r
+                               RelativePath=".\res\output_wnd.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\res\output_wnd_hc.ico"\r
+                               RelativePath="..\Resources\blameres\output_wnd_hc.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\blameres\output_wnd_hc.ico"\r
+                               RelativePath=".\res\output_wnd_hc.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\blameres\properties_hc.bmp"\r
+                               RelativePath=".\res\properties_hc.bmp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\res\properties_hc.bmp"\r
+                               RelativePath="..\Resources\blameres\properties_hc.bmp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\blameres\properties_wnd.ico"\r
+                               RelativePath=".\res\properties_wnd.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\res\properties_wnd.ico"\r
+                               RelativePath="..\Resources\blameres\properties_wnd.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\blameres\Toolbar.bmp"\r
+                               RelativePath=".\res\Toolbar.bmp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\res\Toolbar.bmp"\r
+                               RelativePath="..\Resources\blameres\Toolbar.bmp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\blameres\Toolbar256.bmp"\r
+                               RelativePath=".\res\Toolbar256.bmp"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\res\Toolbar256.bmp"\r
+                               RelativePath="..\Resources\blameres\Toolbar256.bmp"\r
                                >\r
                        </File>\r
                        <File\r
                                </FileConfiguration>\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\blameres\TortoiseGitBlameDoc.ico"\r
+                               RelativePath=".\res\TortoiseGitBlameDoc.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\res\TortoiseGitBlameDoc.ico"\r
+                               RelativePath="..\Resources\blameres\TortoiseGitBlameDoc.ico"\r
                                >\r
                        </File>\r
                        <File\r
index 1def2db..88ba194 100644 (file)
@@ -79,7 +79,7 @@
                                LinkIncremental="2"\r
                                AdditionalLibraryDirectories="../../ext/wingit"\r
                                IgnoreDefaultLibraryNames="libcd.lib;libc;shell32;LIBCMTD;"\r
-                               DelayLoadDLLs="gdiplus.dll"\r
+                               DelayLoadDLLs="gdiplus.dll;wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="2"\r
                                RandomizedBaseAddress="1"\r
                                LinkIncremental="1"\r
                                AdditionalLibraryDirectories="../../ext/wingit"\r
                                IgnoreDefaultLibraryNames="libcd.lib;libc;shell32;LIBCMT"\r
-                               DelayLoadDLLs="gdiplus.dll"\r
+                               DelayLoadDLLs="gdiplus.dll;wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                SubSystem="2"\r
                                OptimizeReferences="2"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\explorer.ico"\r
+                               RelativePath="..\Resources\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\explorer.ico"\r
+                               RelativePath=".\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\newfolder.ico"\r
+                               RelativePath="..\Resources\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\newfolder.ico"\r
+                               RelativePath=".\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\open.ico"\r
+                               RelativePath="..\Resources\open.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\open.ico"\r
+                               RelativePath=".\open.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\save.ico"\r
+                               RelativePath="..\Resources\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\save.ico"\r
+                               RelativePath=".\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\saveas.ico"\r
+                               RelativePath="..\Resources\saveas.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\saveas.ico"\r
+                               RelativePath=".\saveas.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\up.ico"\r
+                               RelativePath="..\Resources\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\up.ico"\r
+                               RelativePath=".\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
index 72d78e7..e387df2 100644 (file)
@@ -92,7 +92,7 @@
                                IgnoreAllDefaultLibraries="false"\r
                                IgnoreDefaultLibraryNames="LIBC"\r
                                ModuleDefinitionFile=".\ShellExt.def"\r
-                               DelayLoadDLLs="gdiplus.dll"\r
+                               DelayLoadDLLs="gdiplus.dll;wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                ProgramDatabaseFile="$(OutDir)/TortoiseGit.pdb"\r
                                OptimizeReferences="1"\r
                                AdditionalLibraryDirectories="../../ext/wingit"\r
                                IgnoreDefaultLibraryNames="libcd, libc, shell32"\r
                                ModuleDefinitionFile=".\ShellExt.def"\r
-                               DelayLoadDLLs="gdiplus.dll"\r
+                               DelayLoadDLLs="gdiplus.dll;wingit.dll"\r
                                GenerateDebugInformation="true"\r
                                ProgramDatabaseFile="$(OutDir)/TortoiseShell.pdb"\r
                                SubSystem="2"\r