OSDN Git Service

character conversion fix for parsed filenames from igit.exe
authorMyagi <snowcoder@gmail.com>
Mon, 23 Feb 2009 22:09:40 +0000 (23:09 +0100)
committerFrank Li <lznuaa@gmail.com>
Tue, 24 Feb 2009 01:06:13 +0000 (09:06 +0800)
src/Git/Git.cpp
src/Git/GitFolderStatus.cpp
src/Git/GitStatus.h
src/Git/TGitPath.cpp
src/Git/TGitPath.h
src/TGitCache/CachedDirectory.cpp

index 922b181..3508193 100644 (file)
@@ -868,6 +868,9 @@ public:
                fileStatus.nFlags = 0;\r
                if (*line == 'D')\r
                        fileStatus.nFlags |= WGFF_Directory;\r
                fileStatus.nFlags = 0;\r
                if (*line == 'D')\r
                        fileStatus.nFlags |= WGFF_Directory;\r
+               else if (*line != 'F')\r
+                       // parse error\r
+                       return false;\r
                line += 2;\r
 \r
                // status\r
                line += 2;\r
 \r
                // status\r
@@ -884,6 +887,10 @@ public:
                case 'I': fileStatus.nStatus = WGFS_Ignored; break;\r
                case 'U': fileStatus.nStatus = WGFS_Unversioned; break;\r
                case 'E': fileStatus.nStatus = WGFS_Empty; break;\r
                case 'I': fileStatus.nStatus = WGFS_Ignored; break;\r
                case 'U': fileStatus.nStatus = WGFS_Unversioned; break;\r
                case 'E': fileStatus.nStatus = WGFS_Empty; break;\r
+               case '?': fileStatus.nStatus = WGFS_Unknown; break;\r
+               default:\r
+                       // parse error\r
+                       return false;\r
                }\r
                line += 2;\r
 \r
                }\r
                line += 2;\r
 \r
@@ -895,7 +902,7 @@ public:
                {\r
                        for (int i=0; i<20; i++)\r
                        {\r
                {\r
                        for (int i=0; i<20; i++)\r
                        {\r
-                               sha1[i] = (HexChar(line[0]) << 8) | HexChar(line[1]);\r
+                               sha1[i] = (BYTE)((HexChar(line[0]) << 8) | HexChar(line[1]));\r
                                line += 2;\r
                        }\r
 \r
                                line += 2;\r
                        }\r
 \r
@@ -903,10 +910,17 @@ public:
                }\r
 \r
                // filename\r
                }\r
 \r
                // filename\r
-               fileStatus.sFileName = line;\r
+               int len = strlen(line);\r
+               if (len && len < 2048)\r
+               {\r
+                       WCHAR *buf = (WCHAR*)alloca((len*4+2)*sizeof(WCHAR));\r
+                       *buf = 0;\r
+                       MultiByteToWideChar(CP_ACP, 0, line, len+1, buf, len*4+1);\r
+                       fileStatus.sFileName = buf;\r
 \r
 \r
-               if ( (*m_pEnumCb)(&fileStatus,m_pUserData) )\r
-                       return false;\r
+                       if (*buf && (*m_pEnumCb)(&fileStatus,m_pUserData))\r
+                               return false;\r
+               }\r
 \r
                return true;\r
        }\r
 \r
                return true;\r
        }\r
index 507070b..16bde65 100644 (file)
@@ -448,7 +448,7 @@ BOOL GitFolderStatus::fillstatusmap(const struct wgFile_s *pFile, void *pUserDat
        stdstring str;\r
        if (pFile->sFileName)\r
        {\r
        stdstring str;\r
        if (pFile->sFileName)\r
        {\r
-               str = CUnicodeUtils::StdGetUnicode(pFile->sFileName);\r
+               str = pFile->sFileName;//CUnicodeUtils::StdGetUnicode(pFile->sFileName);\r
                std::replace(str.begin(), str.end(), '/', '\\');\r
 //MessageBox(NULL, str.c_str(), _T(""), MB_OK);\r
        }\r
                std::replace(str.begin(), str.end(), '/', '\\');\r
 //MessageBox(NULL, str.c_str(), _T(""), MB_OK);\r
        }\r
index aa21fa3..a6d61e5 100644 (file)
@@ -111,7 +111,7 @@ enum WGFILEFLAGS
 \r
 struct wgFile_s\r
 {\r
 \r
 struct wgFile_s\r
 {\r
-       const char *sFileName;                  // filename or directory relative to project root (using forward slashes)\r
+       LPCTSTR sFileName;                              // filename or directory relative to project root (using forward slashes)\r
        int nStatus;                                    // the WGFILESTATUS of the file\r
        int nFlags;                                             // a combination of WGFILEFLAGS\r
 \r
        int nStatus;                                    // the WGFILESTATUS of the file\r
        int nFlags;                                             // a combination of WGFILEFLAGS\r
 \r
index a3ddc54..93787c0 100644 (file)
@@ -128,6 +128,18 @@ void CTGitPath::SetFromGit(const char* pPath, bool bIsDirectory)
        m_bIsDirectory = bIsDirectory;\r
 }\r
 \r
        m_bIsDirectory = bIsDirectory;\r
 }\r
 \r
+void CTGitPath::SetFromGit(const TCHAR* pPath, bool bIsDirectory)\r
+{\r
+       Reset();\r
+       if (pPath)\r
+       {\r
+               m_sFwdslashPath = pPath;\r
+               SanitizeRootPath(m_sFwdslashPath, true);\r
+       }\r
+       m_bDirectoryKnown = true;\r
+       m_bIsDirectory = bIsDirectory;\r
+}\r
+\r
 void CTGitPath::SetFromGit(const CString& sPath,CString *oldpath)\r
 {\r
        Reset();\r
 void CTGitPath::SetFromGit(const CString& sPath,CString *oldpath)\r
 {\r
        Reset();\r
index cbb9256..22bfb09 100644 (file)
@@ -50,6 +50,7 @@ public:
         */\r
        void SetFromGit(const char* pPath);\r
        void SetFromGit(const char* pPath, bool bIsDirectory);\r
         */\r
        void SetFromGit(const char* pPath);\r
        void SetFromGit(const char* pPath, bool bIsDirectory);\r
+       void SetFromGit(const TCHAR* pPath, bool bIsDirectory);\r
        void SetFromGit(const CString& sPath,CString *OldPath=NULL);\r
        \r
        /**\r
        void SetFromGit(const CString& sPath,CString *OldPath=NULL);\r
        \r
        /**\r
index 3edd90b..ed81ef3 100644 (file)
@@ -566,7 +566,7 @@ BOOL CCachedDirectory::GetStatusCallback(const struct wgFile_s *pFile, void *pUs
 {\r
        CCachedDirectory* pThis = (CCachedDirectory*)pUserData;\r
 \r
 {\r
        CCachedDirectory* pThis = (CCachedDirectory*)pUserData;\r
 \r
-       const char *path = pFile->sFileName;\r
+       const TCHAR *path = pFile->sFileName;\r
 \r
        if (path == NULL)\r
                return FALSE;\r
 \r
        if (path == NULL)\r
                return FALSE;\r