OSDN Git Service

Fix Crash Problem When TortoiseGit Install before Msysgit.
authorFrank Li <lznuaa@gmail.com>
Fri, 6 Feb 2009 09:06:52 +0000 (17:06 +0800)
committerFrank Li <lznuaa@gmail.com>
Fri, 6 Feb 2009 09:06:52 +0000 (17:06 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Git/Git.cpp
src/Git/Git.h
src/Git/GitFolderStatus.cpp
src/Git/GitStatus.cpp
src/Git/GitStatus.h
src/Git/gittype.h
src/TortoiseProc/TortoiseProc.cpp

index bf220cd..febd592 100644 (file)
@@ -108,6 +108,41 @@ static BOOL FindGitPath()
 #define MAX_DIRBUFFER 1000\r
 CString CGit::ms_LastMsysGitDir;\r
 CGit g_Git;\r
+BOOL g_IsWingitDllload = TRUE;\r
+\r
+LPBYTE wgGetRevisionID_safe(const char *pszProjectPath, const char *pszName)\r
+{\r
+       if(g_IsWingitDllload)\r
+               return wgGetRevisionID(pszProjectPath,pszName);\r
+       else\r
+               return NULL;\r
+}\r
+\r
+BOOL wgEnumFiles_safe(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData)\r
+{\r
+       if(g_IsWingitDllload)\r
+               return wgEnumFiles(pszProjectPath,pszSubPath,nFlags,pEnumCb,pUserData);\r
+       else\r
+               return FALSE;\r
+}\r
+\r
+static void InitWinGitDll()\r
+{\r
+       __try\r
+       {\r
+\r
+               if ( !wgInit() )\r
+               {\r
+                               // TODO\r
+               }\r
+       }\r
+       __except(1)\r
+       {\r
+               g_IsWingitDllload=FALSE;\r
+               return;\r
+       }\r
+\r
+}\r
 CGit::CGit(void)\r
 {\r
        GetCurrentDirectory(MAX_DIRBUFFER,m_CurrentDir.GetBuffer(MAX_DIRBUFFER));\r
@@ -117,11 +152,7 @@ CGit::CGit(void)
        {\r
                // TODO\r
        }\r
-\r
-       if ( !wgInit() )\r
-       {\r
-               // TODO\r
-       }\r
+       InitWinGitDll();\r
 }\r
 \r
 CGit::~CGit(void)\r
index e661e8f..8249a00 100644 (file)
@@ -76,4 +76,7 @@ extern void GetTempPath(CString &path);
 extern CString GetTempFile();\r
 \r
 \r
-extern CGit g_Git;
\ No newline at end of file
+extern CGit g_Git;\r
+\r
+extern LPBYTE wgGetRevisionID_safe(const char *pszProjectPath, const char *pszName);\r
+extern BOOL wgEnumFiles_safe(const char *pszProjectPath, const char *pszSubPath, unsigned int nFlags, WGENUMFILECB *pEnumCb, void *pUserData);\r
index df2d45f..356948e 100644 (file)
@@ -21,6 +21,7 @@
 #include "GitFolderStatus.h"\r
 #include "UnicodeUtils.h"\r
 #include "..\TGitCache\CacheInterface.h"\r
+#include "Git.h"\r
 //#include "GitGlobal.h"\r
 \r
 extern ShellCache g_ShellCache;\r
@@ -241,7 +242,7 @@ const FileStatusCacheEntry * GitFolderStatus::BuildCache(const CTGitPath& filepa
 \r
 //if (lpszSubPath) MessageBoxA(NULL, lpszSubPath, "BuildCache", MB_OK);\r
 //MessageBoxA(NULL, CStringA(sProjectRoot), sSubPath, MB_OK);\r
-               err = !wgEnumFiles(CStringA(sProjectRoot), lpszSubPath, WGEFF_NoRecurse|WGEFF_FullPath|WGEFF_DirStatusAll, &fillstatusmap, this);\r
+               err = !wgEnumFiles_safe(CStringA(sProjectRoot), lpszSubPath, WGEFF_NoRecurse|WGEFF_FullPath|WGEFF_DirStatusAll, &fillstatusmap, this);\r
 \r
                /*err = svn_client_status4 (&youngest,\r
                        filepath.GetDirectory().GetSVNApiPath(pool),\r
index 272d88f..6d549a6 100644 (file)
@@ -32,7 +32,7 @@
 //#    include "TGitPath.h"\r
 //#    include "PathUtils.h"\r
 #endif\r
-\r
+#include "git.h"\r
 \r
 GitStatus::GitStatus(bool * pbCanceled)\r
        : status(NULL)\r
@@ -238,7 +238,7 @@ git_wc_status_kind GitStatus::GetAllStatus(const CTGitPath& path, git_depth_t de
                nFlags |= WGEFF_NoRecurse;\r
 #endif\r
 \r
-       err = !wgEnumFiles(CStringA(sProjectRoot), lpszSubPath, nFlags, &getallstatus, &statuskind);\r
+       err = !wgEnumFiles_safe(CStringA(sProjectRoot), lpszSubPath, nFlags, &getallstatus, &statuskind);\r
 \r
        /*err = git_client_status4 (&youngest,\r
                                                        path.GetSVNApiPath(pool),\r
@@ -360,8 +360,8 @@ git_revnum_t GitStatus::GetStatus(const CTGitPath& path, bool update /* = false
 \r
        m_status.prop_status = m_status.text_status = git_wc_status_none;\r
 \r
-       // NOTE: currently wgEnumFiles will not enumerate file if it isn't versioned (so status will be git_wc_status_none)\r
-       m_err = !wgEnumFiles(CStringA(sProjectRoot), lpszSubPath, nFlags, &getstatus, &m_status);\r
+       // NOTE: currently wgEnumFiles_safe_safe_safe will not enumerate file if it isn't versioned (so status will be git_wc_status_none)\r
+       m_err = !wgEnumFiles_safe(CStringA(sProjectRoot), lpszSubPath, nFlags, &getstatus, &m_status);\r
 \r
        /*m_err = git_client_status4 (&youngest,\r
                                                        path.GetGitApiPath(m_pool),\r
@@ -399,7 +399,7 @@ git_revnum_t GitStatus::GetStatus(const CTGitPath& path, bool update /* = false
 \r
        if (update)\r
        {\r
-               const BYTE *sha1 = wgGetRevisionID(CStringA(sProjectRoot), NULL);\r
+               const BYTE *sha1 = wgGetRevisionID_safe(CStringA(sProjectRoot), NULL);\r
                if (sha1)\r
                        youngest = ConvertHashToRevnum(sha1);\r
        }\r
index c482b75..a2f757e 100644 (file)
@@ -324,4 +324,3 @@ private:
 };\r
 \r
 \r
-       
\ No newline at end of file
index 5bd3f0f..a8b3028 100644 (file)
@@ -8,6 +8,8 @@ enum
        GIT_ERROR_GET_EXIT_CODE\r
 };\r
 \r
+extern BOOL g_IsWingitDllload;\r
+\r
 class CGitByteArray:public std::vector<BYTE>\r
 {\r
 public:\r
index e6560a6..deaeb03 100644 (file)
@@ -76,7 +76,7 @@ CTortoiseProcApp::CTortoiseProcApp()
        m_bLoadUserToolbars = FALSE;\r
        m_bSaveState = FALSE;\r
        retSuccess = false;\r
-       CGit git;\r
+       //CGit git;\r
        //git.GetUserName();\r
 }\r
 \r