From: Frank Li Date: Wed, 21 Jan 2009 06:27:55 +0000 (+0800) Subject: Use -z parser at gitlog X-Git-Url: http://git.sourceforge.jp/view?p=tortoisegit%2FTortoiseGitJp.git;a=commitdiff_plain;h=da7209a5ce6eb79767374cb9857e89745073d9d2 Use -z parser at gitlog --- diff --git a/src/Git/Git.cpp b/src/Git/Git.cpp index d81542b..1a4562d 100644 --- a/src/Git/Git.cpp +++ b/src/Git/Git.cpp @@ -72,17 +72,17 @@ int CGit::RunAsync(CString cmd,PROCESS_INFORMATION *piOut,HANDLE *hReadOut,CStri } //Must use sperate function to convert ANSI str to union code string //Becuase A2W use stack as internal convert buffer. -void CGit::StringAppend(CString *str,char *p) +void CGit::StringAppend(CString *str,BYTE *p,int code) { USES_CONVERSION; - str->Append(A2W_CP(p,CP_UTF8)); + str->Append(A2W_CP((LPCSTR)p,code)); } BOOL CGit::IsInitRepos() { CString cmdout; cmdout.Empty(); - if(g_Git.Run(_T("git.exe rev-parse --revs-only HEAD"),&cmdout)) + if(g_Git.Run(_T("git.exe rev-parse --revs-only HEAD"),&cmdout,CP_UTF8)) { // CMessageBox::Show(NULL,cmdout,_T("TortoiseGit"),MB_OK); return TRUE; @@ -92,7 +92,7 @@ BOOL CGit::IsInitRepos() return FALSE; } -int CGit::Run(CString cmd, CString* output) +int CGit::Run(CString cmd,BYTE_VECTOR *vector) { PROCESS_INFORMATION pi; HANDLE hRead; @@ -100,10 +100,12 @@ int CGit::Run(CString cmd, CString* output) return GIT_ERROR_CREATE_PROCESS; DWORD readnumber; - while(ReadFile(hRead,g_Buffer,1023,&readnumber,NULL)) + BYTE data; + while(ReadFile(hRead,&data,1,&readnumber,NULL)) { - g_Buffer[readnumber]=0; - StringAppend(output,g_Buffer); + //g_Buffer[readnumber]=0; + vector->push_back(data); +// StringAppend(output,g_Buffer,codes); } @@ -121,18 +123,26 @@ int CGit::Run(CString cmd, CString* output) CloseHandle(hRead); return exitcode; + +} +int CGit::Run(CString cmd, CString* output,int code) +{ + BYTE_VECTOR vector; + Run(cmd,&vector); + StringAppend(output,&(vector[0]),code); + return 0; } CString CGit::GetUserName(void) { CString UserName; - Run(_T("git.exe config user.name"),&UserName); + Run(_T("git.exe config user.name"),&UserName,CP_UTF8); return UserName; } CString CGit::GetUserEmail(void) { CString UserName; - Run(_T("git.exe config user.email"),&UserName); + Run(_T("git.exe config user.email"),&UserName,CP_UTF8); return UserName; } @@ -141,7 +151,7 @@ CString CGit::GetCurrentBranch(void) CString output; //Run(_T("git.exe branch"),&branch); - int ret=g_Git.Run(_T("git.exe branch"),&output); + int ret=g_Git.Run(_T("git.exe branch"),&output,CP_UTF8); if(!ret) { int pos=0; @@ -195,7 +205,7 @@ int CGit::BuildOutputFormat(CString &format,bool IsFull) return 0; } -int CGit::GetLog(CString& logOut, CString &hash, CTGitPath *path ,int count,int mask) +int CGit::GetLog(BYTE_VECTOR& logOut, CString &hash, CTGitPath *path ,int count,int mask) { CString cmd; @@ -235,7 +245,7 @@ int CGit::GetLog(CString& logOut, CString &hash, CTGitPath *path ,int count,int param+=hash; - cmd.Format(_T("git.exe log %s --topo-order --parents %s --pretty=format:\""), + cmd.Format(_T("git.exe log %s -z --topo-order --parents %s --pretty=format:\""), num,param); BuildOutputFormat(log,!(mask&CGit::LOG_INFO_ONLY_HASH)); @@ -354,7 +364,7 @@ git_revnum_t CGit::GetHash(CString &friendname) CString cmd; CString out; cmd.Format(_T("git.exe rev-parse %s" ),friendname); - Run(cmd,&out); + Run(cmd,&out,CP_UTF8); int pos=out.ReverseFind(_T('\n')); if(pos>0) return out.Left(pos); @@ -367,7 +377,7 @@ int CGit::GetTagList(STRING_VECTOR &list) CString cmd,output; cmd=_T("git.exe tag -l"); int i=0; - ret=g_Git.Run(cmd,&output); + ret=g_Git.Run(cmd,&output,CP_UTF8); if(!ret) { int pos=0; @@ -394,7 +404,7 @@ int CGit::GetBranchList(STRING_VECTOR &list,int *current,BRANCH_TYPE type) cmd+=_T(" -r"); int i=0; - ret=g_Git.Run(cmd,&output); + ret=g_Git.Run(cmd,&output,CP_UTF8); if(!ret) { int pos=0; @@ -417,7 +427,7 @@ int CGit::GetRemoteList(STRING_VECTOR &list) int ret; CString cmd,output; cmd=_T("git.exe config --get-regexp remote.*.url"); - ret=g_Git.Run(cmd,&output); + ret=g_Git.Run(cmd,&output,CP_UTF8); if(!ret) { int pos=0; @@ -444,7 +454,7 @@ int CGit::GetMapHashToFriendName(MAP_HASH_NAME &map) int ret; CString cmd,output; cmd=_T("git show-ref -d"); - ret=g_Git.Run(cmd,&output); + ret=g_Git.Run(cmd,&output,CP_UTF8); if(!ret) { int pos=0; @@ -507,7 +517,7 @@ BOOL CGit::CheckMsysGitDir() CString cmd,out; cmd=_T("git.exe --version"); - if(g_Git.Run(cmd,&out)) + if(g_Git.Run(cmd,&out,CP_UTF8)) { return false; } diff --git a/src/Git/Git.h b/src/Git/Git.h index b9da969..b7bde0c 100644 --- a/src/Git/Git.h +++ b/src/Git/Git.h @@ -1,17 +1,8 @@ #pragma once +#include "GitType.h" #include "GitRev.h" #include "GitStatus.h" #include "GitAdminDir.h" -enum -{ - GIT_SUCCESS=0, - GIT_ERROR_OPEN_PIP, - GIT_ERROR_CREATE_PROCESS, - GIT_ERROR_GET_EXIT_CODE -}; - -typedef std::vector STRING_VECTOR; -typedef std::map MAP_HASH_NAME; class CGit @@ -24,7 +15,10 @@ public: // static CString m_MsysGitPath; CGit(void); ~CGit(void); - int Run(CString cmd, CString* output); + + int Run(CString cmd, CString* output,int code); + int Run(CString cmd, BYTE_VECTOR *byte_array); + int RunAsync(CString cmd,PROCESS_INFORMATION *pi, HANDLE* hRead, CString *StdioFile=NULL); int RunLogFile(CString cmd, CString &filename); CString GetUserName(void); @@ -63,13 +57,13 @@ public: int GetMapHashToFriendName(MAP_HASH_NAME &map); //hash is empty means all. -1 means all - int GetLog(CString& logOut,CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME); + int GetLog(BYTE_VECTOR& logOut,CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_STAT|LOG_INFO_FILESTATE|LOG_INFO_BOUNDARY|LOG_INFO_DETECT_COPYRENAME); git_revnum_t GetHash(CString &friendname); int BuildOutputFormat(CString &format,bool IsFull=TRUE); //int GetShortLog(CString &log,CTGitPath * path=NULL, int count =-1); - static void StringAppend(CString *str,char *p); + static void StringAppend(CString *str,BYTE *p,int code=CP_UTF8); BOOL IsInitRepos(); diff --git a/src/Git/Git.vcproj b/src/Git/Git.vcproj index 0a1be56..109a36e 100644 --- a/src/Git/Git.vcproj +++ b/src/Git/Git.vcproj @@ -381,6 +381,10 @@ > + + diff --git a/src/Git/GitRev.cpp b/src/Git/GitRev.cpp index d5e9edb..ba9526f 100644 --- a/src/Git/GitRev.cpp +++ b/src/Git/GitRev.cpp @@ -53,29 +53,35 @@ int GitRev::CopyFrom(GitRev &rev) m_Mark =rev.m_Mark; return 0; } -int GitRev::ParserFromLog(CString &log) +int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) { - int pos=0; + int pos=start; CString one; CString key; CString text; - CString filelist; - TCHAR mode=0; + BYTE_VECTOR filelist; + BYTE mode=0; CTGitPath path; this->m_Files.Clear(); m_Action=0; - - while( pos>=0 ) + int begintime=0; + while( pos <= log.size() && pos>0) { - one=log.Tokenize(_T("\n"),pos); - if(one[0]==_T('#') && one[1] == _T('<') && one[3] == _T('>')) + if(begintime>1) + break; + //one=log.Tokenize(_T("\n"),pos); + if(log[pos]==_T('#') && log[pos+1] == _T('<') && log[pos+3] == _T('>')) { - text = one.Right(one.GetLength()-4); - mode = one[2]; + //text = one.Right(one.GetLength()-4); + 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++; break; case LOG_REV_AUTHOR_NAME: this->m_AuthorName = text; @@ -125,14 +131,16 @@ int GitRev::ParserFromLog(CString &log) { switch(mode) { - case LOG_REV_COMMIT_BODY: - this->m_Body += one+_T("\n"); - break; +// case LOG_REV_COMMIT_BODY: +// this->m_Body += one+_T("\n"); +// break; case LOG_REV_COMMIT_FILE: - filelist += one +_T("\n"); + //filelist += one +_T("\n"); + filelist.append(log,pos,log.find(0,pos)); break; } } + pos=log.find(0,pos); } this->m_Files.ParserFromLog(filelist); @@ -157,7 +165,7 @@ int GitRev::SafeFetchFullInfo(CGit *git) if(InterlockedExchange(&m_IsUpdateing,TRUE) == FALSE) { //GitRev rev; - CString onelog; + BYTE_VECTOR onelog; TCHAR oldmark=this->m_Mark; git->GetLog(onelog,m_CommitHash,NULL,1,CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_DETECT_COPYRENAME); diff --git a/src/Git/GitRev.h b/src/Git/GitRev.h index 84ca319..45f3755 100644 --- a/src/Git/GitRev.h +++ b/src/Git/GitRev.h @@ -1,4 +1,5 @@ #pragma once +#include "gittype.h" #include "GitStatus.h" #include "AtlTime.h" @@ -58,7 +59,7 @@ public: BOOL IsBoundary(){return m_Mark == _T('-');} void Clear(); - int ParserFromLog(CString &log); + int ParserFromLog(BYTE_VECTOR &log,int start=0); CTime ConverFromString(CString input); inline int ParentsCount(){return m_ParentHash.size();} diff --git a/src/Git/GitStatusListCtrl.cpp b/src/Git/GitStatusListCtrl.cpp index 1055bb3..20be5b8 100644 --- a/src/Git/GitStatusListCtrl.cpp +++ b/src/Git/GitStatusListCtrl.cpp @@ -301,6 +301,7 @@ BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList mask|= CGitStatusListCtrl::FILELIST_UNVER; this->UpdateFileList(mask,bUpdate,(CTGitPathList*)&pathList); + #if 0 int refetchcounter = 0; @@ -2713,7 +2714,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) CString cmd; cmd.Format(_T("git.exe add %s"),path->GetGitPathString()); CString output; - if(!g_Git.Run(cmd,&output)) + if(!g_Git.Run(cmd,&output,CP_OEMCP)) { path->m_Action = CTGitPath::LOGACTIONS_ADDED; SetEntryCheck(path,index,true); @@ -5239,7 +5240,7 @@ void CGitStatusListCtrl::NotifyCheck() int CGitStatusListCtrl::UpdateFileList(git_revnum_t hash,CTGitPathList *list) { - CString out; + BYTE_VECTOR out; this->m_bBusy=TRUE; m_CurrentVersion=hash; @@ -5253,7 +5254,8 @@ int CGitStatusListCtrl::UpdateFileList(git_revnum_t hash,CTGitPathList *list) for(int i=0;im_StatusFileList.ParserFromLog(out); diff --git a/src/Git/TGitPath.cpp b/src/Git/TGitPath.cpp index 0d83418..bf0ec78 100644 --- a/src/Git/TGitPath.cpp +++ b/src/Git/TGitPath.cpp @@ -83,18 +83,20 @@ CTGitPath::CTGitPath(const CString& sUnknownPath) : m_Action=0; } -int CTGitPath::ParserAction(CString action) +int CTGitPath::ParserAction(BYTE action) { - action=action.TrimLeft(); - TCHAR c=action.GetAt(0); - if(c == _T('M')) + //action=action.TrimLeft(); + //TCHAR c=action.GetAt(0); + if(action == 'M') m_Action|= LOGACTIONS_MODIFIED; - if(c == _T('R')) + if(action == 'R') m_Action|= LOGACTIONS_REPLACED; - if(c == _T('A')) + if(action == 'A') m_Action|= LOGACTIONS_ADDED; - if(c == _T('D')) + if(action == 'D') m_Action|= LOGACTIONS_DELETED; + if(action == 'U') + m_Action|= LOGACTIONS_UNMERGED; return m_Action; } @@ -856,7 +858,7 @@ int CTGitPathList::FillUnRev(int action,CTGitPathList *list) ignored, (*list)[i].GetWinPathString()); } - +#ifdef VECTOR_F CString out; g_Git.Run(cmd,&out); @@ -872,94 +874,129 @@ int CTGitPathList::FillUnRev(int action,CTGitPathList *list) AddPath(path); } } +#endif } return 0; } -int CTGitPathList::ParserFromLog(CString &log) +int CTGitPathList::ParserFromLog(BYTE_VECTOR &log) { this->Clear(); int pos=0; - CString one; + //CString one; CTGitPath path; m_Action=0; while( pos>=0 ) { - one=log.Tokenize(_T("\n"),pos); + //one=log.Tokenize(_T("\n"),pos); path.Reset(); - if(one[0]==_T(':')) + if(log[pos]==_T(':')) { - int tabstart=0; - int actionstart=0; - CString pathname; - CString action; - one.Tokenize(_T("\t"),tabstart); - if(tabstart >0) + int end=log.find(0,pos); + int actionstart=-1; + int numfile=1; + int file1=-1,file2=-1; + if( end>0 ) { - action=one.Left(tabstart); - actionstart=action.ReverseFind(_T(' ')); - if(actionstart>0) + actionstart=log.find(' ',end-6); + pos=actionstart; + } + if( actionstart>0 ) + { + actionstart++; + + file1 = log.find(0,actionstart); + if( file1>=0 ) { - action=action.Right(action.GetLength()-actionstart); + file1++; + pos=file1; } - pathname=one.Right(one.GetLength()-tabstart); - - CTGitPath *GitPath=LookForGitPath(pathname); - - if(GitPath) + if( log[actionstart] == 'C' || log[actionstart] == 'R' ) { - this->m_Action|=GitPath->ParserAction(action); - - }else - { - int ac=path.ParserAction(action); - if(ac & CTGitPath::LOGACTIONS_REPLACED) + file2=file1; + numfile=2; + file1 = log.find(0,file1); + if(file1>=0 ) { - CString oldname; - int oldnametab=pathname.Find(_T("\t")); - if(oldnametab>0) - path.SetFromGit(pathname.Right(pathname.GetLength()-oldnametab-1),&pathname.Left(oldnametab)); - else - { - ASSERT(FALSE); - path.SetFromGit(pathname); - } - }else - path.SetFromGit(pathname); - path.m_Action=ac; - //action must be set after setfromgit. SetFromGit will clear all status. - this->m_Action|=ac; - AddPath(path); + file1++; + pos=file1; + } + } } - - }else - { + + CString pathname1; + CString pathname2; + + if( file1>=0 ) + g_Git.StringAppend(&pathname1,&log[file1],CP_OEMCP); + if( file2>=0 ) + g_Git.StringAppend(&pathname2,&log[file2],CP_OEMCP); + CTGitPath *GitPath=LookForGitPath(pathname1); + + if(GitPath) + { + this->m_Action|=GitPath->ParserAction( log[actionstart] ); + + }else + { + int ac=path.ParserAction(log[actionstart] ); + + path.SetFromGit(pathname1,&pathname2); + path.m_Action=ac; + //action must be set after setfromgit. SetFromGit will clear all status. + this->m_Action|=ac; + AddPath(path); + + } + + pos=log.find(0,pos); + if(pos>=0) + { + pos++; + } + }else + { int tabstart=0; path.Reset(); - CString StatAdd=(one.Tokenize(_T("\t"),tabstart)); - if( tabstart< 0) - break; - CString StatDel=(one.Tokenize(_T("\t"),tabstart)); - //SetFromGit will reset all context of GitRev - one=one.Right(one.GetLength()-tabstart); - int rename=one.Find(_T(" => ")); - if(rename>0) + CString StatAdd; + CString StatDel; + CString file1; + CString file2; + + tabstart=log.find('\t',pos); + if(tabstart >=0) + { + log[tabstart]=0; + pos=tabstart; + g_Git.StringAppend(&StatAdd,&log[pos],CP_UTF8); + } + + tabstart=log.find('\t',pos); + if(tabstart >=0) { - CString basepath; - int include_left=one.Find(_T("{")); - int include_right=one.Find(_T("}"),rename); - if(include_left>0 && include_right>0 ) + log[tabstart]=0; + pos=tabstart; + g_Git.StringAppend(&StatDel,&log[pos],CP_UTF8); + } + + if(log[pos] == 0) //rename + { + pos++; + g_Git.StringAppend(&file2,&log[pos],CP_OEMCP); + int sec=log.find(0,pos); + if(sec>=0) { - basepath=one.Left(include_left); - CString newname=basepath+one.Mid(rename+4,include_right-rename-4)+one.Right(one.GetLength()-include_right-1); - CString oldname=basepath+one.Mid(include_left+2,rename-include_left-2)+one.Right(one.GetLength()-include_right-1); - path.SetFromGit(newname,&oldname ); - }else - path.SetFromGit(one.Right(one.GetLength()-rename-4),&one.Left(rename)); + sec++; + g_Git.StringAppend(&file1,&log[sec],CP_OEMCP); + } + }else - path.SetFromGit(one); - + { + g_Git.StringAppend(&file1,&log[pos],CP_OEMCP); + } + path.SetFromGit(file1,&file2); + CTGitPath *GitPath=LookForGitPath(path.GetGitPathString()); if(GitPath) { @@ -972,6 +1009,10 @@ int CTGitPathList::ParserFromLog(CString &log) path.m_StatDel=StatDel; AddPath(path); } + + pos=log.find(0,pos); + if(pos>=0) + pos++; } } diff --git a/src/Git/TGitPath.h b/src/Git/TGitPath.h index 5b99a67..66d55cb 100644 --- a/src/Git/TGitPath.h +++ b/src/Git/TGitPath.h @@ -1,4 +1,5 @@ #pragma once +#include "gittype.h" class CTGitPath { @@ -13,6 +14,7 @@ public: LOGACTIONS_MODIFIED = 0x00000002, LOGACTIONS_REPLACED = 0x00000004, LOGACTIONS_DELETED = 0x00000008, + LOGACTIONS_UNMERGED = 0x00000010, LOGACTIONS_UNVER = 0x80000000, LOGACTIONS_IGNORE = 0x40000000, LOGACTIONS_CONFLICT = 0x20000000, @@ -22,7 +24,7 @@ public: CString m_StatDel; int m_Action; bool m_Checked; - int ParserAction(CString action); + int ParserAction(BYTE action); CString GetActionName(); /** * Set the path as an UTF8 string with forward slashes @@ -300,7 +302,7 @@ public: bool LoadFromFile(const CTGitPath& filename); bool WriteToFile(const CString& sFilename, bool bANSI = false) const; CTGitPath * LookForGitPath(CString path); - int ParserFromLog(CString &log); + int ParserFromLog(BYTE_VECTOR &log); int FillUnRev(int Action,CTGitPathList *list=NULL); int GetAction(); /** diff --git a/src/Git/gittype.h b/src/Git/gittype.h new file mode 100644 index 0000000..7aded60 --- /dev/null +++ b/src/Git/gittype.h @@ -0,0 +1,32 @@ +#pragma once + +enum +{ + GIT_SUCCESS=0, + GIT_ERROR_OPEN_PIP, + GIT_ERROR_CREATE_PROCESS, + GIT_ERROR_GET_EXIT_CODE +}; + +class CGitByteArray:public std::vector +{ +public: + int find(BYTE data,int start=0) + { + for(int i=start;i &v,int start=0,int end=-1) + { + if(end<0) + end=v.size(); + for(int i=start;ipush_back(v[i]); + return 0; + } +}; +typedef std::vector STRING_VECTOR; +typedef std::map MAP_HASH_NAME; +typedef CGitByteArray BYTE_VECTOR; \ No newline at end of file diff --git a/src/TortoiseGitBlame/TortoiseGitBlameDoc.cpp b/src/TortoiseGitBlame/TortoiseGitBlameDoc.cpp index 6811a8c..4105e83 100644 --- a/src/TortoiseGitBlame/TortoiseGitBlameDoc.cpp +++ b/src/TortoiseGitBlame/TortoiseGitBlameDoc.cpp @@ -95,7 +95,7 @@ BOOL CTortoiseGitBlameDoc::OnOpenDocument(LPCTSTR lpszPathName,CString Rev) path.SetFromWin(lpszPathName); cmd.Format(_T("git.exe blame -s -l %s -- \"%s\""),Rev,path.GetGitPathString()); m_BlameData.Empty(); - if(g_Git.Run(cmd,&m_BlameData)) + if(g_Git.Run(cmd,&m_BlameData,CP_UTF8)) { CMessageBox::Show(NULL,CString(_T("Blame Error"))+m_BlameData,_T("TortoiseGitBlame"),MB_OK); diff --git a/src/TortoiseProc/AppUtils.cpp b/src/TortoiseProc/AppUtils.cpp index dae0eb6..575fa72 100644 --- a/src/TortoiseProc/AppUtils.cpp +++ b/src/TortoiseProc/AppUtils.cpp @@ -1142,7 +1142,7 @@ bool CAppUtils::CreateBranchTag(bool IsTag,CString *CommitHash) ); } CString out; - if(g_Git.Run(cmd,&out)) + if(g_Git.Run(cmd,&out,CP_UTF8)) { CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK); } diff --git a/src/TortoiseProc/Commands/CreateRepositoryCommand.h b/src/TortoiseProc/Commands/CreateRepositoryCommand.h index 91407d7..4dd86cb 100644 --- a/src/TortoiseProc/Commands/CreateRepositoryCommand.h +++ b/src/TortoiseProc/Commands/CreateRepositoryCommand.h @@ -38,7 +38,7 @@ public: git.m_CurrentDir=this->orgCmdLinePath.GetWinPath(); CString output; - if (git.Run(_T("git.exe init-db"),&output)) + if (git.Run(_T("git.exe init-db"),&output,CP_UTF8)) { CMessageBox::Show(hwndExplorer, IDS_PROC_REPOCREATEERR, IDS_APPNAME, MB_ICONERROR); return false; diff --git a/src/TortoiseProc/Commands/FormatPatchCommand.cpp b/src/TortoiseProc/Commands/FormatPatchCommand.cpp index 0c1138e..2756b32 100644 --- a/src/TortoiseProc/Commands/FormatPatchCommand.cpp +++ b/src/TortoiseProc/Commands/FormatPatchCommand.cpp @@ -54,7 +54,7 @@ bool FormatPatchCommand::Execute() ); CString out; - if(g_Git.Run(cmd,&out)) + if(g_Git.Run(cmd,&out,CP_OEMCP)) { CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK); } diff --git a/src/TortoiseProc/Commands/ImportPatchCommand.cpp b/src/TortoiseProc/Commands/ImportPatchCommand.cpp index 67b6570..84ae291 100644 --- a/src/TortoiseProc/Commands/ImportPatchCommand.cpp +++ b/src/TortoiseProc/Commands/ImportPatchCommand.cpp @@ -37,7 +37,7 @@ bool ImportPatchCommand::Execute() { cmd.Format(_T("git.exe am \"%s\""),dlg.m_PathList[i].GetGitPathString()); CString output; - if(g_Git.Run(cmd,&output)) + if(g_Git.Run(cmd,&output,CP_OEMCP)) { CMessageBox::Show(NULL,output,_T("TortoiseGit"),MB_OK); return FALSE; diff --git a/src/TortoiseProc/Commands/MergeCommand.cpp b/src/TortoiseProc/Commands/MergeCommand.cpp index 98a569b..2b35fcc 100644 --- a/src/TortoiseProc/Commands/MergeCommand.cpp +++ b/src/TortoiseProc/Commands/MergeCommand.cpp @@ -43,7 +43,7 @@ bool MergeCommand::Execute() dlg.m_VersionName); CString output; - g_Git.Run(cmd,&output); + g_Git.Run(cmd,&output,CP_OEMCP); CMessageBox::Show(NULL,output,_T("TortoiseGit"),MB_OK); } diff --git a/src/TortoiseProc/Commands/RemoveCommand.cpp b/src/TortoiseProc/Commands/RemoveCommand.cpp index 8c725f7..6cc97c6 100644 --- a/src/TortoiseProc/Commands/RemoveCommand.cpp +++ b/src/TortoiseProc/Commands/RemoveCommand.cpp @@ -130,7 +130,7 @@ bool RemoveCommand::Execute() for(int nPath = 0; nPath < pathList.GetCount(); nPath++) { CString output; - if(g_Git.Run(cmd+pathList[nPath].GetGitPathString(),&output)) + if(g_Git.Run(cmd+pathList[nPath].GetGitPathString(),&output,CP_OEMCP)) { key=CMessageBox::Show(hwndExplorer, output, _T("TortoiseGit"), MB_ICONINFORMATION|MB_OKCANCEL); if(key == IDCANCEL) diff --git a/src/TortoiseProc/Commands/RenameCommand.cpp b/src/TortoiseProc/Commands/RenameCommand.cpp index e05c7d4..e203adc 100644 --- a/src/TortoiseProc/Commands/RenameCommand.cpp +++ b/src/TortoiseProc/Commands/RenameCommand.cpp @@ -56,7 +56,7 @@ bool RenameCommand::Execute() cmdLinePath.GetGitPathString(), sNewName); - if(g_Git.Run(cmd,&output)) + if(g_Git.Run(cmd,&output,CP_OEMCP)) { CMessageBox::Show(hwndExplorer, output, _T("TortoiseGit"), MB_OK); } diff --git a/src/TortoiseProc/Commands/RevertCommand.cpp b/src/TortoiseProc/Commands/RevertCommand.cpp index f34779f..62b9a73 100644 --- a/src/TortoiseProc/Commands/RevertCommand.cpp +++ b/src/TortoiseProc/Commands/RevertCommand.cpp @@ -37,7 +37,7 @@ bool RevertCommand::Execute() for(int i=0;i< dlg.m_selectedPathList.GetCount() ;i++) { cmd.Format(_T("git.exe checkout -f -- \"%s\""),dlg.m_selectedPathList[i].GetGitPathString()); - if(g_Git.Run(cmd,&out)) + if(g_Git.Run(cmd,&out,CP_OEMCP)) { CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK); } diff --git a/src/TortoiseProc/CommitDlg.cpp b/src/TortoiseProc/CommitDlg.cpp index f71be87..4bc7dd1 100644 --- a/src/TortoiseProc/CommitDlg.cpp +++ b/src/TortoiseProc/CommitDlg.cpp @@ -383,7 +383,7 @@ void CCommitDlg::OnOK() } #endif cmd.Format(_T("git.exe update-index -- \"%s\""),entry->GetGitPathString()); - g_Git.Run(cmd,&out); + g_Git.Run(cmd,&out,CP_OEMCP); nchecked++; //checkedLists.insert(entry->GetGitPathString()); // checkedfiles += _T("\"")+entry->GetGitPathString()+_T("\" "); @@ -394,12 +394,12 @@ void CCommitDlg::OnOK() if(entry->m_Action & CTGitPath::LOGACTIONS_ADDED) { //To init git repository, there are not HEAD, so we can use git reset command cmd.Format(_T("git.exe rm --cache -- \"%s\""),entry->GetGitPathString()); - g_Git.Run(cmd,&out); + g_Git.Run(cmd,&out,CP_OEMCP); } else { cmd.Format(_T("git.exe reset -- %s"),entry->GetGitPathString()); - g_Git.Run(cmd,&out); + g_Git.Run(cmd,&out,CP_OEMCP); } // uncheckedfiles += _T("\"")+entry->GetGitPathString()+_T("\" "); @@ -451,7 +451,7 @@ void CCommitDlg::OnOK() out =_T(""); cmd.Format(_T("git.exe commit -F \"%s\""), tempfile); - g_Git.Run(cmd,&out); + g_Git.Run(cmd,&out,CP_OEMCP); CFile::Remove(tempfile); diff --git a/src/TortoiseProc/FileDiffDlg.cpp b/src/TortoiseProc/FileDiffDlg.cpp index 9796df9..fb89fc9 100644 --- a/src/TortoiseProc/FileDiffDlg.cpp +++ b/src/TortoiseProc/FileDiffDlg.cpp @@ -258,7 +258,7 @@ UINT CFileDiffDlg::DiffThread() cmd.Format(_T("git.exe diff-tree -r --raw -C -M --numstat %s %s"),rev1,m_rev2.m_CommitHash); } - CString out; + BYTE_VECTOR out; g_Git.Run(cmd,&out); this->m_arFileList.ParserFromLog(out); diff --git a/src/TortoiseProc/GitDiff.cpp b/src/TortoiseProc/GitDiff.cpp index cfed705..5a08e47 100644 --- a/src/TortoiseProc/GitDiff.cpp +++ b/src/TortoiseProc/GitDiff.cpp @@ -19,7 +19,7 @@ int CGitDiff::Parser(git_revnum_t &rev) CString cmd; cmd.Format(_T("git.exe rev-parse %s"),rev); CString output; - if(!g_Git.Run(cmd,&output)) + if(!g_Git.Run(cmd,&output,CP_UTF8)) { //int start=output.Find(_T('\n')); rev=output.Left(40); diff --git a/src/TortoiseProc/LogDataVector.cpp b/src/TortoiseProc/LogDataVector.cpp index b276d1f..4a1b577 100644 --- a/src/TortoiseProc/LogDataVector.cpp +++ b/src/TortoiseProc/LogDataVector.cpp @@ -66,7 +66,7 @@ int CLogDataVector::ParserShortLog(CTGitPath *path ,CString &hash,int count ,int mask ) { - CString log; + BYTE_VECTOR log; GitRev rev; if(g_Git.IsInitRepos()) @@ -79,27 +79,23 @@ int CLogDataVector::ParserShortLog(CTGitPath *path ,CString &hash,int count ,int g_Git.GetLog(log,hash,path,count,mask); - if(log.GetLength()==0) + if(log.size()==0) return 0; int start=4; int length; - int next =1; - while( next>0 ) + int next =0; + while( next>=0 ) { - next=log.Find(begin,start); - if(next >0 ) - length = next - start+4; - else - length = log.GetLength()-start+4; - - CString onelog =log; - onelog=log.Mid(start -4,length); - rev.ParserFromLog(onelog); + next=rev.ParserFromLog(log,next); + rev.m_Subject=_T("Load ................................."); this->push_back(rev); m_HashMap[rev.m_CommitHash]=size()-1; - start = next +4; + + if(next>0) + next++; + //next=log.find(0,next); } return 0; @@ -112,7 +108,7 @@ int CLogDataVector::FetchFullInfo(int i) //CLogDataVector Class int CLogDataVector::ParserFromLog(CTGitPath *path ,int count ,int infomask) { - CString log; + BYTE_VECTOR log; GitRev rev; CString emptyhash; g_Git.GetLog(log,emptyhash,path,count,infomask); @@ -120,7 +116,7 @@ int CLogDataVector::ParserFromLog(CTGitPath *path ,int count ,int infomask) CString begin; begin.Format(_T("#<%c>"),LOG_REV_ITEM_BEGIN); - if(log.GetLength()==0) + if(log.size()==0) return 0; int start=4; @@ -128,18 +124,11 @@ int CLogDataVector::ParserFromLog(CTGitPath *path ,int count ,int infomask) int next =1; while( next>0 ) { - next=log.Find(begin,start); - if(next >0 ) - length = next - start+4; - else - length = log.GetLength()-start+4; - - CString onelog =log; - onelog=log.Mid(start -4,length); - rev.ParserFromLog(onelog); + next=rev.ParserFromLog(log,next); this->push_back(rev); - m_HashMap[rev.m_CommitHash]=size()-1; - start = next +4; + m_HashMap[rev.m_CommitHash]=size()-1; + if(next>=0) + next++; } return 0;