OSDN Git Service

New parser can show Chinese file name
authorFrank Li <lznuaa@gmail.com>
Wed, 21 Jan 2009 08:54:29 +0000 (16:54 +0800)
committerFrank Li <lznuaa@gmail.com>
Wed, 21 Jan 2009 08:54:29 +0000 (16:54 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Git/Git.cpp
src/Git/GitRev.cpp
src/Git/TGitPath.cpp
src/Git/gittype.h
src/TortoiseProc/LogDataVector.cpp
src/TortoiseProc/TortoiseProc.cpp

index 1a4562d..6ad1097 100644 (file)
@@ -171,35 +171,35 @@ CString CGit::GetCurrentBranch(void)
 int CGit::BuildOutputFormat(CString &format,bool IsFull)\r
 {\r
        CString log;\r
-       log.Format(_T("#<%c>%%n"),LOG_REV_ITEM_BEGIN);\r
+       log.Format(_T("#<%c>%%x00"),LOG_REV_ITEM_BEGIN);\r
        format += log;\r
        if(IsFull)\r
        {\r
-               log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME);\r
+               log.Format(_T("#<%c>%%an%%x00"),LOG_REV_AUTHOR_NAME);\r
                format += log;\r
-               log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL);\r
+               log.Format(_T("#<%c>%%ae%%x00"),LOG_REV_AUTHOR_EMAIL);\r
                format += log;\r
-               log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE);\r
+               log.Format(_T("#<%c>%%ai%%x00"),LOG_REV_AUTHOR_DATE);\r
                format += log;\r
-               log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME);\r
+               log.Format(_T("#<%c>%%cn%%x00"),LOG_REV_COMMIT_NAME);\r
                format += log;\r
-               log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL);\r
+               log.Format(_T("#<%c>%%ce%%x00"),LOG_REV_COMMIT_EMAIL);\r
                format += log;\r
-               log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE);\r
+               log.Format(_T("#<%c>%%ci%%x00"),LOG_REV_COMMIT_DATE);\r
                format += log;\r
-               log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT);\r
+               log.Format(_T("#<%c>%%s%%x00"),LOG_REV_COMMIT_SUBJECT);\r
                format += log;\r
-               log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY);\r
+               log.Format(_T("#<%c>%%b%%x00"),LOG_REV_COMMIT_BODY);\r
                format += log;\r
        }\r
-       log.Format(_T("#<%c>%%m%%H%%n"),LOG_REV_COMMIT_HASH);\r
+       log.Format(_T("#<%c>%%m%%H%%x00"),LOG_REV_COMMIT_HASH);\r
        format += log;\r
-       log.Format(_T("#<%c>%%P%%n"),LOG_REV_COMMIT_PARENT);\r
+       log.Format(_T("#<%c>%%P%%x00"),LOG_REV_COMMIT_PARENT);\r
        format += log;\r
 \r
        if(IsFull)\r
        {\r
-               log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE);\r
+               log.Format(_T("#<%c>%%x00"),LOG_REV_COMMIT_FILE);\r
                format += log;\r
        }\r
        return 0;\r
index ba9526f..2aaab15 100644 (file)
@@ -65,10 +65,12 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
        this->m_Files.Clear();\r
     m_Action=0;\r
        int begintime=0;\r
-       while( pos <= log.size() && pos>0)\r
+       BYTE *p=&log[0];\r
+       int filebegin=-1;\r
+\r
+       while( pos < log.size() && pos>=0)\r
        {\r
-               if(begintime>1)\r
-                       break;\r
+               \r
                //one=log.Tokenize(_T("\n"),pos);\r
                if(log[pos]==_T('#') && log[pos+1] == _T('<') && log[pos+3] == _T('>'))\r
                {\r
@@ -76,12 +78,15 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
                        text.Empty();\r
                        g_Git.StringAppend(&text,&log[pos+4],CP_UTF8);\r
                        mode = log[pos+2];\r
-\r
+                       \r
                        switch(mode)\r
                        {\r
                        case LOG_REV_ITEM_BEGIN:\r
-                               this->Clear();\r
                                begintime++;\r
+                               if(begintime>1)\r
+                                       break;\r
+                               else\r
+                                       this->Clear();\r
                                break;\r
                        case LOG_REV_AUTHOR_NAME:\r
                                this->m_AuthorName = text;\r
@@ -136,16 +141,29 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
 //                             break;\r
                        case LOG_REV_COMMIT_FILE:\r
                                //filelist += one +_T("\n");\r
-                               filelist.append(log,pos,log.find(0,pos));                               \r
+                               //filelist.append(log,pos,log.find(0,pos));\r
+                               if(filebegin<0)\r
+                                       filebegin=pos;\r
                                break;\r
                        }\r
                }\r
-               pos=log.find(0,pos);\r
+               \r
+               if(begintime>1)\r
+               {\r
+                       break;\r
+               }\r
+\r
+               //find next string start \r
+               pos=log.findNextString(pos);\r
        }\r
        \r
-       this->m_Files.ParserFromLog(filelist);\r
-       this->m_Action=this->m_Files.GetAction();\r
-       return 0;\r
+       if(filebegin>=0)\r
+       {\r
+               filelist.append(log,filebegin,pos);     \r
+               this->m_Files.ParserFromLog(filelist);\r
+               this->m_Action=this->m_Files.GetAction();\r
+       }\r
+       return pos;\r
 }\r
 \r
 CTime GitRev::ConverFromString(CString input)\r
index bf0ec78..e33d018 100644 (file)
@@ -882,14 +882,18 @@ int CTGitPathList::ParserFromLog(BYTE_VECTOR &log)
 {\r
        this->Clear();\r
        int pos=0;\r
+       BYTE *p=&log[0];\r
        //CString one;\r
        CTGitPath path;\r
        m_Action=0;\r
-       while( pos>=0 )\r
+       while( pos>=0 && pos<log.size())\r
        {\r
                //one=log.Tokenize(_T("\n"),pos);\r
                path.Reset();\r
-               if(log[pos]==_T(':'))\r
+               if(log[pos]=='\n')\r
+                       pos++;\r
+\r
+               if(log[pos]==':')\r
                {\r
                        int end=log.find(0,pos);\r
                        int actionstart=-1;\r
@@ -949,12 +953,7 @@ int CTGitPathList::ParserFromLog(BYTE_VECTOR &log)
                                AddPath(path);\r
                                \r
                        }\r
-               \r
-                       pos=log.find(0,pos);\r
-                       if(pos>=0)\r
-                       {\r
-                               pos++;\r
-                       }\r
+       \r
                }else\r
                {                       \r
                        int tabstart=0;\r
@@ -968,16 +967,17 @@ int CTGitPathList::ParserFromLog(BYTE_VECTOR &log)
                        if(tabstart >=0)\r
                        {\r
                                log[tabstart]=0;\r
-                               pos=tabstart;\r
                                g_Git.StringAppend(&StatAdd,&log[pos],CP_UTF8);\r
+                               pos=tabstart+1;\r
                        }\r
 \r
                        tabstart=log.find('\t',pos);\r
                        if(tabstart >=0)\r
                        {\r
                                log[tabstart]=0;\r
-                               pos=tabstart;\r
+                               \r
                                g_Git.StringAppend(&StatDel,&log[pos],CP_UTF8);\r
+                               pos=tabstart+1;\r
                        }\r
                        \r
                        if(log[pos] == 0) //rename\r
@@ -1010,11 +1010,8 @@ int CTGitPathList::ParserFromLog(BYTE_VECTOR &log)
                                AddPath(path);\r
                        }\r
 \r
-                       pos=log.find(0,pos);\r
-                       if(pos>=0)\r
-                               pos++;\r
                }\r
-\r
+               pos=log.findNextString(pos);\r
        }\r
        return pos;\r
 }\r
index 7aded60..5bd3f0f 100644 (file)
@@ -18,6 +18,24 @@ public:
                                return i;\r
                return -1;\r
        }\r
+       int findNextString(int start=0)\r
+       {\r
+               int pos=start;\r
+               do\r
+               {\r
+                       pos=find(0,pos);\r
+                       if(pos >= 0)\r
+                               pos++;\r
+                       else\r
+                               break;\r
+\r
+                       if( pos >= size())\r
+                               return -1;\r
+\r
+               }while(at(pos)==0);\r
+\r
+               return pos;\r
+       }\r
        int append( std::vector<BYTE> &v,int start=0,int end=-1)\r
        {\r
                if(end<0)\r
index 4a1b577..095d55a 100644 (file)
@@ -85,16 +85,14 @@ int CLogDataVector::ParserShortLog(CTGitPath *path ,CString &hash,int count ,int
        int start=4;
        int length;
        int next =0;
-       while( next>=0 )
+       while( next>=0 && next<log.size())
        {
                next=rev.ParserFromLog(log,next);
 
                rev.m_Subject=_T("Load .................................");
                this->push_back(rev);
                m_HashMap[rev.m_CommitHash]=size()-1;
-               
-               if(next>0)
-                       next++;
+
                //next=log.find(0,next);
        }
 
@@ -127,8 +125,6 @@ int CLogDataVector::ParserFromLog(CTGitPath *path ,int count ,int infomask)
                next=rev.ParserFromLog(log,next);
                this->push_back(rev);
                m_HashMap[rev.m_CommitHash]=size()-1;           
-               if(next>=0)
-                       next++;
        }
 
        return 0;
index 1966392..cc28df0 100644 (file)
@@ -75,7 +75,7 @@ CTortoiseProcApp::CTortoiseProcApp()
        m_bSaveState = FALSE;\r
        retSuccess = false;\r
        CGit git;\r
-       git.GetUserName();\r
+       //git.GetUserName();\r
 }\r
 \r
 CTortoiseProcApp::~CTortoiseProcApp()\r