From: Myagi Date: Mon, 23 Feb 2009 22:09:40 +0000 (+0100) Subject: character conversion fix for parsed filenames from igit.exe X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;ds=sidebyside;h=717a832ff7b63239506540183f38e4838ab8ca9c;p=tortoisegit%2FTortoiseGitJp.git character conversion fix for parsed filenames from igit.exe --- diff --git a/src/Git/Git.cpp b/src/Git/Git.cpp index 922b181..3508193 100644 --- a/src/Git/Git.cpp +++ b/src/Git/Git.cpp @@ -868,6 +868,9 @@ public: fileStatus.nFlags = 0; if (*line == 'D') fileStatus.nFlags |= WGFF_Directory; + else if (*line != 'F') + // parse error + return false; line += 2; // status @@ -884,6 +887,10 @@ public: case 'I': fileStatus.nStatus = WGFS_Ignored; break; case 'U': fileStatus.nStatus = WGFS_Unversioned; break; case 'E': fileStatus.nStatus = WGFS_Empty; break; + case '?': fileStatus.nStatus = WGFS_Unknown; break; + default: + // parse error + return false; } line += 2; @@ -895,7 +902,7 @@ public: { for (int i=0; i<20; i++) { - sha1[i] = (HexChar(line[0]) << 8) | HexChar(line[1]); + sha1[i] = (BYTE)((HexChar(line[0]) << 8) | HexChar(line[1])); line += 2; } @@ -903,10 +910,17 @@ public: } // filename - fileStatus.sFileName = line; + int len = strlen(line); + if (len && len < 2048) + { + WCHAR *buf = (WCHAR*)alloca((len*4+2)*sizeof(WCHAR)); + *buf = 0; + MultiByteToWideChar(CP_ACP, 0, line, len+1, buf, len*4+1); + fileStatus.sFileName = buf; - if ( (*m_pEnumCb)(&fileStatus,m_pUserData) ) - return false; + if (*buf && (*m_pEnumCb)(&fileStatus,m_pUserData)) + return false; + } return true; } diff --git a/src/Git/GitFolderStatus.cpp b/src/Git/GitFolderStatus.cpp index 507070b..16bde65 100644 --- a/src/Git/GitFolderStatus.cpp +++ b/src/Git/GitFolderStatus.cpp @@ -448,7 +448,7 @@ BOOL GitFolderStatus::fillstatusmap(const struct wgFile_s *pFile, void *pUserDat stdstring str; if (pFile->sFileName) { - str = CUnicodeUtils::StdGetUnicode(pFile->sFileName); + str = pFile->sFileName;//CUnicodeUtils::StdGetUnicode(pFile->sFileName); std::replace(str.begin(), str.end(), '/', '\\'); //MessageBox(NULL, str.c_str(), _T(""), MB_OK); } diff --git a/src/Git/GitStatus.h b/src/Git/GitStatus.h index aa21fa3..a6d61e5 100644 --- a/src/Git/GitStatus.h +++ b/src/Git/GitStatus.h @@ -111,7 +111,7 @@ enum WGFILEFLAGS struct wgFile_s { - const char *sFileName; // filename or directory relative to project root (using forward slashes) + LPCTSTR sFileName; // filename or directory relative to project root (using forward slashes) int nStatus; // the WGFILESTATUS of the file int nFlags; // a combination of WGFILEFLAGS diff --git a/src/Git/TGitPath.cpp b/src/Git/TGitPath.cpp index a3ddc54..93787c0 100644 --- a/src/Git/TGitPath.cpp +++ b/src/Git/TGitPath.cpp @@ -128,6 +128,18 @@ void CTGitPath::SetFromGit(const char* pPath, bool bIsDirectory) m_bIsDirectory = bIsDirectory; } +void CTGitPath::SetFromGit(const TCHAR* pPath, bool bIsDirectory) +{ + Reset(); + if (pPath) + { + m_sFwdslashPath = pPath; + SanitizeRootPath(m_sFwdslashPath, true); + } + m_bDirectoryKnown = true; + m_bIsDirectory = bIsDirectory; +} + void CTGitPath::SetFromGit(const CString& sPath,CString *oldpath) { Reset(); diff --git a/src/Git/TGitPath.h b/src/Git/TGitPath.h index cbb9256..22bfb09 100644 --- a/src/Git/TGitPath.h +++ b/src/Git/TGitPath.h @@ -50,6 +50,7 @@ public: */ void SetFromGit(const char* pPath); void SetFromGit(const char* pPath, bool bIsDirectory); + void SetFromGit(const TCHAR* pPath, bool bIsDirectory); void SetFromGit(const CString& sPath,CString *OldPath=NULL); /** diff --git a/src/TGitCache/CachedDirectory.cpp b/src/TGitCache/CachedDirectory.cpp index 3edd90b..ed81ef3 100644 --- a/src/TGitCache/CachedDirectory.cpp +++ b/src/TGitCache/CachedDirectory.cpp @@ -566,7 +566,7 @@ BOOL CCachedDirectory::GetStatusCallback(const struct wgFile_s *pFile, void *pUs { CCachedDirectory* pThis = (CCachedDirectory*)pUserData; - const char *path = pFile->sFileName; + const TCHAR *path = pFile->sFileName; if (path == NULL) return FALSE;