From 5104ca6d7663c6ac2167a19293b9af3e7bc09ca7 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Sat, 12 Mar 2011 20:36:06 +0800 Subject: [PATCH] Fix TGitStatus wrong when filenameA is substring of filenameB For example file1 name is abc file2 name is abcd Signed-off-by: Frank Li --- src/Git/GitIndex.cpp | 7 +++++-- src/Git/GitStatus.cpp | 8 ++++---- src/Git/gitindex.h | 19 ++++++++++++++----- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/Git/GitIndex.cpp b/src/Git/GitIndex.cpp index 553550cdd..1dc83f0da 100644 --- a/src/Git/GitIndex.cpp +++ b/src/Git/GitIndex.cpp @@ -184,7 +184,7 @@ int CGitIndexList::GetFileStatus(const CString &gitdir,const CString &pathorg,gi CString path = pathorg; path.MakeLower(); - int start=SearchInSortVector(*this, ((CString&)path).GetBuffer(), path.GetLength()); + int start=SearchInSortVector(*this, ((CString&)path).GetBuffer(),-1); ((CString&)path).ReleaseBuffer(); if( start<0 ) @@ -418,7 +418,10 @@ int CGitIndexFileMap::IsUnderVersionControl(const CString &gitdir, const CString if(pIndex.get()) { - *isVersion = (SearchInSortVector(*pIndex, subpath.GetBuffer(), subpath.GetLength()) >= 0); + if(isDir) + *isVersion = (SearchInSortVector(*pIndex, subpath.GetBuffer(), subpath.GetLength()) >= 0); + else + *isVersion = (SearchInSortVector(*pIndex, subpath.GetBuffer(), -1) >= 0); } }catch(...) diff --git a/src/Git/GitStatus.cpp b/src/Git/GitStatus.cpp index ae4ed5975..f3e6d5f93 100644 --- a/src/Git/GitStatus.cpp +++ b/src/Git/GitStatus.cpp @@ -969,7 +969,7 @@ int GitStatus::GetFileStatus(const CString &gitdir,const CString &pathParam,git_ { //add item - int start =SearchInSortVector(*treeptr,lowcasepath.GetBuffer(),lowcasepath.GetLength()); + int start =SearchInSortVector(*treeptr,lowcasepath.GetBuffer(),-1); if(start<0) { @@ -1229,7 +1229,7 @@ int GitStatus::EnumDirStatus(const CString &gitdir,const CString &subpath,git_wc hit = treeptr->begin()+hstart; for(int i=hstart;i<=hend;i++) { - if( SearchInSortVector(*indexptr, (*hit).m_FileName.GetBuffer(),(*hit).m_FileName.GetLength()) <0 ) + if( SearchInSortVector(*indexptr, (*hit).m_FileName.GetBuffer(),-1) <0 ) { *status =max(git_wc_status_deleted, *status); break; @@ -1383,7 +1383,7 @@ int GitStatus::GetDirStatus(const CString &gitdir,const CString &subpath,git_wc_ { for(int i=start;i<=end;i++) { - pos =SearchInSortVector(*treeptr, (*it).m_FileName.GetBuffer(), (*it).m_FileName.GetLength()); + pos =SearchInSortVector(*treeptr, (*it).m_FileName.GetBuffer(), -1); if(pos < 0) { @@ -1430,7 +1430,7 @@ int GitStatus::GetDirStatus(const CString &gitdir,const CString &subpath,git_wc_ hit = treeptr->begin()+start; for(int i=hstart;i<=hend;i++) { - if( SearchInSortVector(*indexptr,(*hit).m_FileName.GetBuffer(),(*hit).m_FileName.GetLength()) < 0) + if( SearchInSortVector(*indexptr,(*hit).m_FileName.GetBuffer(),-1) < 0) { *status = git_wc_status_deleted; break; diff --git a/src/Git/gitindex.h b/src/Git/gitindex.h index 184c796b9..5f1d698c1 100644 --- a/src/Git/gitindex.h +++ b/src/Git/gitindex.h @@ -508,7 +508,10 @@ int SearchInSortVector(T &vector, LPTSTR pstr, int len) while(!( start == end && start==mid)) { int cmp; - cmp = _tcsnccmp( vector[mid].m_FileName,pstr,len ); + if(len < 0) + cmp = _tcscmp(vector[mid].m_FileName,pstr); + else + cmp = _tcsnccmp( vector[mid].m_FileName,pstr,len ); if(cmp ==0) return mid; @@ -525,10 +528,16 @@ int SearchInSortVector(T &vector, LPTSTR pstr, int len) mid=(start +end ) /2; } - - if(_tcsnccmp( vector[mid].m_FileName,pstr,len ) == 0) - return mid; - + if(len <0) + { + if(_tcscmp(vector[mid].m_FileName,pstr) == 0) + return mid; + } + else + { + if(_tcsnccmp( vector[mid].m_FileName,pstr,len ) == 0) + return mid; + } return -1; }; #if 0 -- 2.11.4.GIT