OSDN Git Service

Fix format string %s , commit_hash problem.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogListBase.cpp
index be3f139..59c6386 100644 (file)
@@ -74,6 +74,7 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
 \r
        m_IsIDReplaceAction=FALSE;\r
 \r
+       this->m_critSec.Init();\r
        m_wcRev.m_CommitHash.Empty();\r
        m_wcRev.m_Subject=_T("Working dir changes");\r
        m_wcRev.m_ParentHash.clear();\r
@@ -321,7 +322,7 @@ void CGitLogListBase::ResizeAllListCtrlCols()
 \r
 BOOL CGitLogListBase::GetShortName(CString ref, CString &shortname,CString prefix)\r
 {\r
-       TRACE(_T("%s %s\r\n"),ref,prefix);\r
+       //TRACE(_T("%s %s\r\n"),ref,prefix);\r
        if(ref.Left(prefix.GetLength()) ==  prefix)\r
        {\r
                shortname = ref.Right(ref.GetLength()-prefix.GetLength());\r
@@ -992,7 +993,7 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                                rect.right=second.left;\r
                                        }\r
                                        \r
-                                       TRACE(_T("A Graphic left %d right %d\r\n"),rect.left,rect.right);\r
+                                       //TRACE(_T("A Graphic left %d right %d\r\n"),rect.left,rect.right);\r
                                        FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);\r
                                        \r
                                        GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);\r
@@ -1053,7 +1054,7 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                GitRev* pLogEntry = reinterpret_cast<GitRev *>(m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec));\r
                                CRect rect;\r
                                GetSubItemRect(pLVCD->nmcd.dwItemSpec, pLVCD->iSubItem, LVIR_BOUNDS, rect);\r
-                               TRACE(_T("Action left %d right %d\r\n"),rect.left,rect.right);\r
+                               //TRACE(_T("Action left %d right %d\r\n"),rect.left,rect.right);\r
                                // Get the selected state of the\r
                                // item being drawn.                                                    \r
 \r
@@ -1152,7 +1153,7 @@ void CGitLogListBase::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                        lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_AuthorName, pItem->cchTextMax);\r
                break;\r
        case this->LOGLIST_DATE: //Date\r
-               if (!pLogEntry && pLogEntry->m_CommitHash.IsEmpty())\r
+               if ( pLogEntry && (!pLogEntry->m_CommitHash.IsEmpty()) )\r
                        lstrcpyn(pItem->pszText,\r
                                CAppUtils::FormatDateAndTime( pLogEntry->m_AuthorDate, m_DateFormat, true, m_bRelativeTimes ), \r
                                pItem->cchTextMax);\r
@@ -1743,11 +1744,14 @@ 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
        this->m_logEntries.ClearAll();\r
+       git_init();\r
+\r
+       this->m_LogCache.ClearAllParent();\r
 \r
        m_LogCache.FetchCacheIndex(g_Git.m_CurrentDir);\r
 \r
@@ -1761,12 +1765,17 @@ int CGitLogListBase::FillGitShortLog()
        int mask;\r
        mask = CGit::LOG_INFO_ONLY_HASH | CGit::LOG_INFO_BOUNDARY;\r
 //     if(this->m_bAllBranch)\r
-       mask |= m_ShowMask;\r
+       mask |= m_ShowMask ;\r
        \r
+       this->m_arShownList.RemoveAll();\r
+\r
        if(m_bShowWC)\r
+       {\r
                this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev.m_CommitHash);\r
+               this->m_LogCache.m_HashMap[m_wcRev.m_CommitHash]=m_wcRev;\r
+       }\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,NULL,NULL,true);\r
 \r
        //this->m_logEntries.ParserFromLog();\r
        if(IsInWorkingThread())\r
@@ -1777,23 +1786,12 @@ int CGitLogListBase::FillGitShortLog()
        {\r
                SetItemCountEx(this->m_logEntries.size());\r
        }\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
@@ -1872,6 +1870,9 @@ void CGitLogListBase::GetTimeRange(CTime &oldest, CTime &latest)
        latest=CTime(1971,1,2,0,0,0);\r
        for(unsigned int i=0;i<m_logEntries.size();i++)\r
        {\r
+               if(m_logEntries[i].IsEmpty())\r
+                       continue;\r
+\r
                if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() < oldest.GetTime())\r
                        oldest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
 \r
@@ -1936,11 +1937,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 +2021,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 +2033,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 +2051,102 @@ 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
+       TRACE(_T("\n===Begin===\n"));\r
+       //Update work copy item;\r
+       if( m_logEntries.size() > 0)\r
+       {\r
+               GitRev *pRev = &m_logEntries.GetGitRevAt(0);\r
+               \r
+               m_arShownList.Add(pRev);\r
+\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
+       InterlockedExchange(&m_bNoDispUpdates, FALSE);\r
+\r
+       git_get_log_firstcommit(m_DllGitLog);\r
+       int total = git_get_log_estimate_commit_count(m_DllGitLog);\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
+               GitRev *pRev = m_LogCache.GetCacheData(hash);\r
+               \r
+               if(pRev == NULL || !pRev->m_IsFull)\r
+               {\r
+                       pRev->ParserFromCommit(&commit);\r
+                       pRev->ParserParentFromCommit(&commit);\r
+                       pRev->SafeFetchFullInfo(&g_Git);\r
+                                               \r
+               }else\r
+               {\r
+                       ASSERT(pRev->m_CommitHash == hash);\r
+                       pRev->ParserParentFromCommit(&commit);\r
+               }\r
+#ifdef DEBUG           \r
+               pRev->DbgPrint();\r
+               TRACE(_T("\n"));\r
+#endif\r
+               git_free_commit(&commit);\r
+\r
+               this->m_critSec.Lock();\r
+               m_logEntries.push_back(hash);\r
+               m_arShownList.Add(pRev);\r
+               this->m_critSec.Unlock();\r
 \r
+               if(t2-t1>500 || (m_logEntries.size()-oldsize >100))\r
+               {\r
+                       //update UI\r
+                       int percent=m_logEntries.size()*100/total + GITLOG_START+1;\r
+                       if(percent > 99)\r
+                               percent =99;\r
+                       if(percent < GITLOG_START)\r
+                               percent = GITLOG_START +1;\r
+\r
+                       oldsize = m_logEntries.size();\r
+                       PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL|LVSICF_NOSCROLL);\r
+                       ::PostMessage(this->GetParent()->m_hWnd,MSG_LOAD_PERCENTAGE,(WPARAM) percent,0);\r
+               }               \r
+       }\r
+       \r
+       //Update UI;\r
+       PostMessage(LVM_SETITEMCOUNT, (WPARAM) this->m_logEntries.size(),(LPARAM) LVSICF_NOINVALIDATEALL|LVSICF_NOSCROLL);\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 +2265,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
@@ -2250,7 +2348,7 @@ void CGitLogListBase::RecalculateShownList(CPtrArray * pShownlist)
                                ATLTRACE(_T("messge = \"%s\"\n"),m_logEntries.GetGitRevAt(i).m_Subject);\r
                                if (regex_search(wstring((LPCTSTR)m_logEntries.GetGitRevAt(i).m_Subject), pat, flags)&&IsEntryInDateRange(i))\r
                                {\r
-                                       pShownlist->Add(&m_logEntries[i]);\r
+                                       pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
                                        continue;\r
                                }\r
 \r
@@ -2303,7 +2401,7 @@ void CGitLogListBase::RecalculateShownList(CPtrArray * pShownlist)
                        }\r
                        if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_REVS))\r
                        {\r
-                               sRev.Format(_T("%s"), m_logEntries.GetGitRevAt(i).m_CommitHash);\r
+                               sRev.Format(_T("%s"), m_logEntries.GetGitRevAt(i).m_CommitHash.ToString());\r
                                if (regex_search(wstring((LPCTSTR)sRev), pat, flags)&&IsEntryInDateRange(i))\r
                                {\r
                                        pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
@@ -2343,7 +2441,7 @@ void CGitLogListBase::RecalculateShownList(CPtrArray * pShownlist)
                                msg = msg.MakeLower();\r
                                if ((msg.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
                                {\r
-                                       pShownlist->Add(&m_logEntries[i]);\r
+                                       pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r
                                        continue;\r
                                }\r
                        }\r
@@ -2395,7 +2493,7 @@ void CGitLogListBase::RecalculateShownList(CPtrArray * pShownlist)
                        }\r
                        if ((m_nSelectedFilter == LOGFILTER_ALL)||(m_nSelectedFilter == LOGFILTER_REVS))\r
                        {\r
-                               sRev.Format(_T("%s"), m_logEntries.GetGitRevAt(i).m_CommitHash);\r
+                               sRev.Format(_T("%s"), m_logEntries.GetGitRevAt(i).m_CommitHash.ToString());\r
                                if ((sRev.Find(find) >= 0)&&(IsEntryInDateRange(i)))\r
                                {\r
                                        pShownlist->Add(&m_logEntries.GetGitRevAt(i));\r