From d39d6c9d0b7881dba6a54b620e73e272556d0feb Mon Sep 17 00:00:00 2001 From: Frank Li Date: Wed, 21 Jan 2009 16:54:29 +0800 Subject: [PATCH] New parser can show Chinese file name Signed-off-by: Frank Li --- src/Git/Git.cpp | 24 ++++++++++++------------ src/Git/GitRev.cpp | 38 ++++++++++++++++++++++++++++---------- src/Git/TGitPath.cpp | 25 +++++++++++-------------- src/Git/gittype.h | 18 ++++++++++++++++++ src/TortoiseProc/LogDataVector.cpp | 8 ++------ src/TortoiseProc/TortoiseProc.cpp | 2 +- 6 files changed, 72 insertions(+), 43 deletions(-) diff --git a/src/Git/Git.cpp b/src/Git/Git.cpp index 1a4562d..6ad1097 100644 --- a/src/Git/Git.cpp +++ b/src/Git/Git.cpp @@ -171,35 +171,35 @@ CString CGit::GetCurrentBranch(void) int CGit::BuildOutputFormat(CString &format,bool IsFull) { CString log; - log.Format(_T("#<%c>%%n"),LOG_REV_ITEM_BEGIN); + log.Format(_T("#<%c>%%x00"),LOG_REV_ITEM_BEGIN); format += log; if(IsFull) { - log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME); + log.Format(_T("#<%c>%%an%%x00"),LOG_REV_AUTHOR_NAME); format += log; - log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL); + log.Format(_T("#<%c>%%ae%%x00"),LOG_REV_AUTHOR_EMAIL); format += log; - log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE); + log.Format(_T("#<%c>%%ai%%x00"),LOG_REV_AUTHOR_DATE); format += log; - log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME); + log.Format(_T("#<%c>%%cn%%x00"),LOG_REV_COMMIT_NAME); format += log; - log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL); + log.Format(_T("#<%c>%%ce%%x00"),LOG_REV_COMMIT_EMAIL); format += log; - log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE); + log.Format(_T("#<%c>%%ci%%x00"),LOG_REV_COMMIT_DATE); format += log; - log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT); + log.Format(_T("#<%c>%%s%%x00"),LOG_REV_COMMIT_SUBJECT); format += log; - log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY); + log.Format(_T("#<%c>%%b%%x00"),LOG_REV_COMMIT_BODY); format += log; } - log.Format(_T("#<%c>%%m%%H%%n"),LOG_REV_COMMIT_HASH); + log.Format(_T("#<%c>%%m%%H%%x00"),LOG_REV_COMMIT_HASH); format += log; - log.Format(_T("#<%c>%%P%%n"),LOG_REV_COMMIT_PARENT); + log.Format(_T("#<%c>%%P%%x00"),LOG_REV_COMMIT_PARENT); format += log; if(IsFull) { - log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE); + log.Format(_T("#<%c>%%x00"),LOG_REV_COMMIT_FILE); format += log; } return 0; diff --git a/src/Git/GitRev.cpp b/src/Git/GitRev.cpp index ba9526f..2aaab15 100644 --- a/src/Git/GitRev.cpp +++ b/src/Git/GitRev.cpp @@ -65,10 +65,12 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) this->m_Files.Clear(); m_Action=0; int begintime=0; - while( pos <= log.size() && pos>0) + BYTE *p=&log[0]; + int filebegin=-1; + + while( pos < log.size() && pos>=0) { - if(begintime>1) - break; + //one=log.Tokenize(_T("\n"),pos); if(log[pos]==_T('#') && log[pos+1] == _T('<') && log[pos+3] == _T('>')) { @@ -76,12 +78,15 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) text.Empty(); g_Git.StringAppend(&text,&log[pos+4],CP_UTF8); mode = log[pos+2]; - + switch(mode) { case LOG_REV_ITEM_BEGIN: - this->Clear(); begintime++; + if(begintime>1) + break; + else + this->Clear(); break; case LOG_REV_AUTHOR_NAME: this->m_AuthorName = text; @@ -136,16 +141,29 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) // break; case LOG_REV_COMMIT_FILE: //filelist += one +_T("\n"); - filelist.append(log,pos,log.find(0,pos)); + //filelist.append(log,pos,log.find(0,pos)); + if(filebegin<0) + filebegin=pos; break; } } - pos=log.find(0,pos); + + if(begintime>1) + { + break; + } + + //find next string start + pos=log.findNextString(pos); } - this->m_Files.ParserFromLog(filelist); - this->m_Action=this->m_Files.GetAction(); - return 0; + if(filebegin>=0) + { + filelist.append(log,filebegin,pos); + this->m_Files.ParserFromLog(filelist); + this->m_Action=this->m_Files.GetAction(); + } + return pos; } CTime GitRev::ConverFromString(CString input) diff --git a/src/Git/TGitPath.cpp b/src/Git/TGitPath.cpp index bf0ec78..e33d018 100644 --- a/src/Git/TGitPath.cpp +++ b/src/Git/TGitPath.cpp @@ -882,14 +882,18 @@ int CTGitPathList::ParserFromLog(BYTE_VECTOR &log) { this->Clear(); int pos=0; + BYTE *p=&log[0]; //CString one; CTGitPath path; m_Action=0; - while( pos>=0 ) + while( pos>=0 && pos=0) - { - pos++; - } + }else { int tabstart=0; @@ -968,16 +967,17 @@ int CTGitPathList::ParserFromLog(BYTE_VECTOR &log) if(tabstart >=0) { log[tabstart]=0; - pos=tabstart; g_Git.StringAppend(&StatAdd,&log[pos],CP_UTF8); + pos=tabstart+1; } tabstart=log.find('\t',pos); if(tabstart >=0) { log[tabstart]=0; - pos=tabstart; + g_Git.StringAppend(&StatDel,&log[pos],CP_UTF8); + pos=tabstart+1; } if(log[pos] == 0) //rename @@ -1010,11 +1010,8 @@ int CTGitPathList::ParserFromLog(BYTE_VECTOR &log) AddPath(path); } - pos=log.find(0,pos); - if(pos>=0) - pos++; } - + pos=log.findNextString(pos); } return pos; } diff --git a/src/Git/gittype.h b/src/Git/gittype.h index 7aded60..5bd3f0f 100644 --- a/src/Git/gittype.h +++ b/src/Git/gittype.h @@ -18,6 +18,24 @@ public: return i; return -1; } + int findNextString(int start=0) + { + int pos=start; + do + { + pos=find(0,pos); + if(pos >= 0) + pos++; + else + break; + + if( pos >= size()) + return -1; + + }while(at(pos)==0); + + return pos; + } int append( std::vector &v,int start=0,int end=-1) { if(end<0) diff --git a/src/TortoiseProc/LogDataVector.cpp b/src/TortoiseProc/LogDataVector.cpp index 4a1b577..095d55a 100644 --- a/src/TortoiseProc/LogDataVector.cpp +++ b/src/TortoiseProc/LogDataVector.cpp @@ -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 && nextpush_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; diff --git a/src/TortoiseProc/TortoiseProc.cpp b/src/TortoiseProc/TortoiseProc.cpp index 1966392..cc28df0 100644 --- a/src/TortoiseProc/TortoiseProc.cpp +++ b/src/TortoiseProc/TortoiseProc.cpp @@ -75,7 +75,7 @@ CTortoiseProcApp::CTortoiseProcApp() m_bSaveState = FALSE; retSuccess = false; CGit git; - git.GetUserName(); + //git.GetUserName(); } CTortoiseProcApp::~CTortoiseProcApp() -- 2.11.0