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