OSDN Git Service

Finish Coding to change fetch log with gitdll
authorFrank Li <lznuaa@gmail.com>
Fri, 8 Jan 2010 13:17:40 +0000 (21:17 +0800)
committerFrank Li <lznuaa@gmail.com>
Fri, 8 Jan 2010 13:17:40 +0000 (21:17 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Git/GitRev.cpp
src/TortoiseProc/GitLogCache.cpp
src/TortoiseProc/GitLogListBase.cpp
src/TortoiseProc/GitLogListBase.h
src/TortoiseProc/gitlogcache.h
src/Utils/UnicodeUtils.cpp
src/Utils/UnicodeUtils.h

index eca555b..b787a68 100644 (file)
@@ -67,6 +67,7 @@ int GitRev::CopyFrom(GitRev &rev,bool OmitParentAndMark)
        m_CommitHash    =rev.m_CommitHash       ;\r
        m_Files                 =rev.m_Files                    ;       \r
        m_Action                =rev.m_Action           ;\r
+       m_IsFull                =rev.m_IsFull;\r
 \r
        if(!OmitParentAndMark)\r
        {\r
index 8b0458c..70145be 100644 (file)
@@ -17,22 +17,27 @@ int CLogCache::AddCacheEntry(GitRev &Rev)
        return 0;\r
 }\r
 \r
-int CLogCache::GetCacheData(GitRev &Rev)\r
+GitRev * CLogCache::GetCacheData(CGitHash &hash)\r
 {\r
-       if(this->m_HashMapIndex.find(Rev.m_CommitHash)==m_HashMapIndex.end())\r
+       if(this->m_HashMapIndex.find(hash)==m_HashMapIndex.end())\r
        {\r
-               if(this->m_HashMap.IsExist(Rev.m_CommitHash))\r
+               if(this->m_HashMap.IsExist(hash))\r
                {\r
-                       Rev.CopyFrom(m_HashMap[Rev.m_CommitHash]);\r
-                       return 0;\r
+                       return &m_HashMap[hash];\r
                }\r
-               return -1;\r
+               return NULL;\r
        }\r
        else\r
        {\r
-               return LoadOneItem(Rev,m_HashMapIndex[Rev.m_CommitHash]);\r
+               GitRev rev;\r
+               if(!LoadOneItem(rev,m_HashMapIndex[hash]))\r
+               {\r
+                       rev.m_IsFull=true;\r
+                       m_HashMap[hash].CopyFrom(rev);\r
+                       return &m_HashMap[hash];\r
+               }\r
        }\r
-       return 0;\r
+       return NULL;\r
 }\r
 int CLogCache::FetchCacheIndex(CString GitDir)\r
 {\r
@@ -283,7 +288,7 @@ int CLogCache::SaveCache()
        {\r
                if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
                {\r
-                       if((*i).second.m_IsFull)\r
+                       if((*i).second.m_IsFull && !(*i).second.m_CommitHash.IsEmpty())\r
                        {\r
                                ULONGLONG offset = m_DataFile.GetPosition();\r
                                this->SaveOneItem((*i).second,offset);\r
index be3f139..58700ed 100644 (file)
@@ -1743,7 +1743,7 @@ int CGitLogListBase::FillGitLog(CTGitPath *path,int info,CString *from,CString *
 \r
 }\r
 \r
-int CGitLogListBase::FillGitShortLog()\r
+int CGitLogListBase::BeginFetchLog()\r
 {\r
        ClearText();\r
 \r
@@ -1766,7 +1766,7 @@ int CGitLogListBase::FillGitShortLog()
        if(m_bShowWC)\r
                this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev.m_CommitHash);\r
 \r
-       this->m_logEntries.FetchShortLog(path,m_StartRef,-1,mask,m_bShowWC?1:0);\r
+       CString cmd=g_Git.GetLogCmd(m_StartRef,path,-1,mask);\r
 \r
        //this->m_logEntries.ParserFromLog();\r
        if(IsInWorkingThread())\r
@@ -1779,21 +1779,12 @@ int CGitLogListBase::FillGitShortLog()
        }\r
 \r
        this->m_arShownList.RemoveAll();\r
-\r
-       for(unsigned int i=0;i<m_logEntries.size();i++)\r
+       \r
+       if(git_open_log(&m_DllGitLog,CUnicodeUtils::GetMulti(cmd,CP_ACP).GetBuffer()))\r
        {\r
-               if(i>0 || !m_logEntries.GetGitRevAt(i).m_CommitHash.IsEmpty())\r
-                       m_logEntries.GetGitRevAt(i).m_Subject=_T("parser...");\r
-\r
-               if(this->m_IsOldFirst)\r
-               {\r
-                       this->m_arShownList.Add(&m_logEntries[m_logEntries.size()-1-i]);\r
-\r
-               }else\r
-               {\r
-                       this->m_arShownList.Add(&m_logEntries[i]);\r
-               }\r
+               return -1;\r
        }\r
+\r
        return 0;\r
 }\r
 \r
@@ -1936,11 +1927,12 @@ public:
                if(revInVector->m_IsFull)\r
                        return;\r
 \r
-               if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries.GetGitRevAt(rev)))\r
+               GitRev *pRev= m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries[rev]);\r
+               if(pRev)\r
                {\r
                        ++m_CollectedCount;\r
-                       InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsUpdateing,FALSE);\r
-                       InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsFull,TRUE);\r
+                       InterlockedExchange(&pRev->m_IsUpdateing,FALSE);\r
+                       InterlockedExchange(&pRev->m_IsFull,TRUE);\r
                        ::PostMessage(m_ploglist->m_hWnd,MSG_LOADED,(WPARAM)rev,0);\r
                        return;\r
                }\r
@@ -2019,7 +2011,8 @@ void CGitLogListBase::FetchLastLogInfo()
                        if(m_logEntries.GetGitRevAt(i).m_IsFull)\r
                                continue;\r
 \r
-                       if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
+                       GitRev *pRev = m_LogCache.GetCacheData(m_logEntries[i]);\r
+                       if(pRev == NULL)\r
                        {\r
                                if(!m_logEntries.FetchFullInfo(i))\r
                                {\r
@@ -2030,8 +2023,8 @@ void CGitLogListBase::FetchLastLogInfo()
                        }else\r
                        {\r
                                updated++;\r
-                               InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
-                               InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsFull,TRUE);\r
+                               InterlockedExchange(&pRev->m_IsUpdateing,FALSE);\r
+                               InterlockedExchange(&pRev->m_IsFull,TRUE);\r
                        }\r
                        \r
                        ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)i,0);\r
@@ -2048,7 +2041,82 @@ void CGitLogListBase::FetchLastLogInfo()
 \r
 UINT CGitLogListBase::LogThread()\r
 {\r
+       ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_START,0);\r
+       \r
+       InterlockedExchange(&m_bThreadRunning, TRUE);\r
+       InterlockedExchange(&m_bNoDispUpdates, TRUE);\r
+\r
+       ULONGLONG  t1,t2;\r
+       \r
+       if(BeginFetchLog())\r
+               return -1;\r
 \r
+       //Update work copy item;\r
+       if( m_logEntries.size() > 0)\r
+       {\r
+               GitRev *pRev = &m_logEntries.GetGitRevAt(0);\r
+               if( pRev->m_CommitHash.IsEmpty() )\r
+               {\r
+                       pRev->m_Files.Clear();\r
+                       pRev->m_ParentHash.clear();\r
+                       pRev->m_ParentHash.push_back(m_HeadHash);\r
+                       g_Git.GetCommitDiffList(pRev->m_CommitHash.ToString(),this->m_HeadHash, pRev->m_Files);\r
+                       pRev->m_Action =0;\r
+               \r
+                       for(int j=0;j< pRev->m_Files.GetCount();j++)\r
+                       pRev->m_Action |= pRev->m_Files[j].m_Action;\r
+                       \r
+                       pRev->m_Body.Format(_T("%d files changed"),m_logEntries.GetGitRevAt(0).m_Files.GetCount());\r
+                       ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)0,0);\r
+               }\r
+       }\r
+\r
+       GIT_COMMIT commit;\r
+       t1=GetTickCount();\r
+\r
+       int oldsize=m_logEntries.size();\r
+       while( git_get_log_nextcommit(this->m_DllGitLog,&commit) == 0)\r
+       {\r
+               //printf("%s\r\n",commit.m_Subject);\r
+               if(m_bExitThread)\r
+                       break;\r
+\r
+               CGitHash hash = (char*)commit.m_hash ;\r
+\r
+               m_logEntries.push_back(hash);\r
+               \r
+               GitRev *pRev = m_LogCache.GetCacheData(hash);\r
+               \r
+               if(pRev == NULL || !pRev->m_IsFull)\r
+               {\r
+                       pRev->ParserFromCommit(&commit);\r
+                       pRev->ParserParentFromCommit(&commit);\r
+\r
+                       pRev->SafeFetchFullInfo(&g_Git);\r
+                       git_free_commit(&commit);\r
+                       \r
+               }else\r
+               {\r
+                       ASSERT(pRev->m_CommitHash == hash);\r
+                       pRev->ParserParentFromCommit(&commit);\r
+               }\r
+\r
+               if(t2-t1>500 && m_logEntries.size()<(oldsize+100) )\r
+               {\r
+                       //update UI\r
+                       oldsize = m_logEntries.size();\r
+                       PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL);\r
+                       ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_END,0);\r
+               }               \r
+       }\r
+       \r
+       //Update UI;\r
+       PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL);\r
+       ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_END,0);\r
+\r
+       InterlockedExchange(&m_bThreadRunning, FALSE);\r
+\r
+#if 0\r
 //     if(m_ProcCallBack)\r
 //             m_ProcCallBack(m_ProcData,GITLOG_START);\r
        ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_START,0);\r
@@ -2167,7 +2235,7 @@ UINT CGitLogListBase::LogThread()
        ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) GITLOG_END,0);\r
 \r
        InterlockedExchange(&m_bThreadRunning, FALSE);\r
-\r
+#endif\r
        return 0;\r
 }\r
 \r
index 5b7051f..ceaebbb 100644 (file)
@@ -156,7 +156,7 @@ public:
        void CopySelectionToClipBoard(bool hashonly=FALSE);\r
        void DiffSelectedRevWithPrevious();\r
        bool IsSelectionContinuous();\r
-       int  FillGitShortLog();\r
+       int  BeginFetchLog();\r
        int  FillGitLog(CTGitPath *path,int infomask=CGit::     LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,CString *from=NULL,CString *to=NULL);\r
 \r
        inline int ShownCountWithStopped() const { return (int)m_arShownList.GetCount() + (m_bStrictStopped ? 1 : 0); }\r
@@ -275,6 +275,7 @@ protected:
        COLORREF                        m_LineColors[Lanes::COLORS_NUM];\r
        DWORD                           m_DateFormat;   // DATE_SHORTDATE or DATE_LONGDATE\r
        bool                            m_bRelativeTimes;       // Show relative times\r
+       GIT_LOG                         m_DllGitLog;\r
 };\r
 \r
 \r
index e79f346..61280af 100644 (file)
@@ -103,7 +103,7 @@ public:
        CGitHashMap m_HashMap;\r
        std::map<CGitHash, ULONGLONG> m_HashMapIndex;\r
 \r
-       int GetCacheData(GitRev &Rev);\r
+       GitRev * GetCacheData(CGitHash &Rev);\r
        int AddCacheEntry(GitRev &Rev);\r
        int SaveCache();\r
 \r
index 20aede4..acad667 100644 (file)
@@ -207,8 +207,14 @@ int CUnicodeUtils::GetCPCode(CString &codename)
 \r
        return CP_UTF8;\r
 }\r
+\r
 CStringA CUnicodeUtils::GetUTF8(const CStringW& string)\r
 {\r
+       return GetMulti(string,CP_UTF8);\r
+}\r
+\r
+CStringA CUnicodeUtils::GetMulti(const CStringW& string,int acp)\r
+{\r
        char * buf;\r
        CStringA retVal;\r
        int len = string.GetLength();\r
@@ -216,11 +222,12 @@ CStringA CUnicodeUtils::GetUTF8(const CStringW& string)
                return retVal;\r
        buf = retVal.GetBuffer(len*4 + 1);\r
 //     SecureZeroMemory(buf, (string.GetLength()*4 + 1)*sizeof(char));\r
-       int lengthIncTerminator = WideCharToMultiByte(CP_UTF8, 0, string, -1, buf, len*4, NULL, NULL);\r
+       int lengthIncTerminator = WideCharToMultiByte(acp, 0, string, -1, buf, len*4, NULL, NULL);\r
        retVal.ReleaseBuffer(lengthIncTerminator-1);\r
        return retVal;\r
 }\r
 \r
+\r
 CStringA CUnicodeUtils::GetUTF8(const CStringA& string)\r
 {\r
        WCHAR * buf;\r
index 364339b..6ab7f66 100644 (file)
@@ -42,6 +42,7 @@ public:
        ~CUnicodeUtils(void);\r
 #if defined(_MFC_VER) || defined(CSTRING_AVAILABLE)\r
        static CStringA GetUTF8(const CStringW& string);\r
+       static CStringA GetMulti(const CStringW& string, int acp);\r
        static CStringA GetUTF8(const CStringA& string);\r
        static CString GetUnicode(const CStringA& string);\r
        static CStringA ConvertWCHARStringToUTF8(const CString& string);\r