OSDN Git Service

Change Log Code structure Unfinished
authorFrank Li <lznuaa@gmail.com>
Sat, 2 Jan 2010 14:34:19 +0000 (22:34 +0800)
committerFrank Li <lznuaa@gmail.com>
Sat, 2 Jan 2010 14:34:19 +0000 (22:34 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
14 files changed:
src/Git/Git.vcproj
src/Git/GitHash.h [new file with mode: 0644]
src/Git/GitRev.cpp
src/Git/GitRev.h
src/TortoiseGit.sln
src/TortoiseProc/GitLogCache.cpp
src/TortoiseProc/GitLogListAction.cpp
src/TortoiseProc/GitLogListBase.cpp
src/TortoiseProc/LogDataVector.cpp
src/TortoiseProc/LogDlgHelper.h
src/TortoiseProc/TortoiseProc.vcproj
src/TortoiseProc/gitlogcache.h
src/TortoiseShell/SVNPropertyPage.cpp
src/Utils/TempFile.cpp

index 5d039e7..4ed73df 100644 (file)
@@ -46,7 +46,7 @@
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
                                PreprocessorDefinitions="WIN32;_DEBUG;_LIB"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
                                Optimization="0"\r
-                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
                                PreprocessorDefinitions="WIN64;_DEBUG;_LIB"\r
                                MinimalRebuild="true"\r
                                BasicRuntimeChecks="3"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
                                PreprocessorDefinitions="WIN32;NDEBUG;_LIB"\r
                                RuntimeLibrary="2"\r
                                EnableFunctionLevelLinking="true"\r
                        />\r
                        <Tool\r
                                Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+                               AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
                                PreprocessorDefinitions="WIN64;NDEBUG;_LIB"\r
                                RuntimeLibrary="2"\r
                                EnableFunctionLevelLinking="true"\r
diff --git a/src/Git/GitHash.h b/src/Git/GitHash.h
new file mode 100644 (file)
index 0000000..6b12c47
--- /dev/null
@@ -0,0 +1,101 @@
+#pragma once\r
+#if defined(_MFC_VER)\r
+#include "afx.h"\r
+#endif\r
+#define GIT_HASH_SIZE 20\r
+\r
+class CGitHash\r
+{\r
+       unsigned char m_hash[GIT_HASH_SIZE];\r
+public:\r
+       CGitHash()\r
+       {\r
+               memset(m_hash,0, GIT_HASH_SIZE);\r
+       }\r
+       CGitHash(char *p)\r
+       {\r
+               memcpy(m_hash,p,GIT_HASH_SIZE);\r
+       }       \r
+       CGitHash(CString &str)\r
+       {\r
+               for(int i=0;i<GIT_HASH_SIZE;i++)\r
+               {\r
+                       unsigned char a;\r
+                       a=0;\r
+                       for(int j=2*i;j<2*i+1;j++)\r
+                       {\r
+                               TCHAR ch = str[j];\r
+                               if(ch >= _T('0') && ch <= _T('9'))\r
+                                       a |= (ch - _T('0'))&0xF;\r
+                               else if(ch >=_T('A') && ch <= _T('F'))\r
+                                       a |= (ch - _T('A'))&0xF;\r
+                               else if(ch >=_T('a') && ch <= _T('f'))\r
+                                       a |= (ch - _T('a'))&0xF;\r
+                               \r
+                               a =a<<4;\r
+                       }\r
+                       m_hash[i]=a;\r
+               }\r
+       }\r
+       void Empty()\r
+       {\r
+               memset(m_hash,0, GIT_HASH_SIZE);\r
+       }\r
+       bool IsEmpty()\r
+       {\r
+               for(int i=0;i<GIT_HASH_SIZE;i++)\r
+               {\r
+                       if(m_hash[i] != 0)\r
+                               return false;\r
+               }\r
+               return true;\r
+       }\r
+       \r
+       CString ToString()\r
+       {\r
+               CString str;\r
+               CString a;\r
+               for(int i=0;i<GIT_HASH_SIZE;i++)\r
+               {\r
+                       a.Format(_T("%02X"),m_hash[i]);\r
+                       str+=a;\r
+               }\r
+               return str;\r
+       }\r
+       operator CString ()\r
+       { \r
+               return ToString(); \r
+       } \r
+\r
+       bool operator == (CGitHash &hash)\r
+       {\r
+               return memcmp(m_hash,hash.m_hash,GIT_HASH_SIZE) == 0;\r
+       }\r
+       \r
+       \r
+       friend bool operator<(const CGitHash& left, const CGitHash& right)\r
+       {\r
+               return memcmp(left.m_hash,right.m_hash,GIT_HASH_SIZE) < 0;\r
+       }\r
+\r
+       friend bool operator>(const CGitHash& left, const CGitHash& right)\r
+       {\r
+               return memcmp(left.m_hash, right.m_hash, GIT_HASH_SIZE) > 0;\r
+       }\r
+\r
+#if defined(_MFC_VER)\r
+       friend CArchive& AFXAPI operator<<(CArchive& ar, CGitHash& hash)\r
+       {\r
+               for(int i=0;i<GIT_HASH_SIZE;i++)\r
+                       ar<<hash.m_hash[i];\r
+               return ar;\r
+       }\r
+       friend CArchive& AFXAPI operator>>(CArchive& ar, CGitHash& hash)\r
+       {\r
+               for(int i=0;i<GIT_HASH_SIZE;i++)\r
+                       ar>>hash.m_hash[i];\r
+               return ar;\r
+       }\r
+#endif\r
+};\r
+\r
index f8e741b..145dbe9 100644 (file)
@@ -2,6 +2,7 @@
 #include "ATLComTime.h"\r
 #include "GitRev.h"\r
 #include "Git.h"\r
+#include "GitDLL.h"\r
 \r
 class CException; //Just in case afx.h is not included (cannot be included in every project which uses this file)\r
 \r
@@ -254,8 +255,8 @@ int GitRev::SafeFetchFullInfo(CGit *git)
                //GitRev rev;\r
                BYTE_VECTOR onelog;\r
                TCHAR oldmark=this->m_Mark;\r
-       \r
-               git->GetLog(onelog,m_CommitHash,NULL,1,CGit::LOG_INFO_FULL_DIFF|CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_DETECT_COPYRENAME|CGit::LOG_INFO_SHOW_MERGEDFILE);\r
+               CString commithash = m_CommitHash;\r
+               git->GetLog(onelog,commithash,NULL,1,CGit::LOG_INFO_FULL_DIFF|CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_DETECT_COPYRENAME|CGit::LOG_INFO_SHOW_MERGEDFILE);\r
                CString oldhash=m_CommitHash;\r
                GIT_REV_LIST oldlist=this->m_ParentHash;\r
                ParserFromLog(onelog);\r
index 2fc1cf2..320a75b 100644 (file)
@@ -2,8 +2,9 @@
 #include "gittype.h"\r
 #include "GitStatus.h"\r
 #include "AtlTime.h"\r
+#include "GitHash.h"\r
 \r
-typedef std::vector<git_revnum_t> GIT_REV_LIST;\r
+typedef std::vector<CGitHash> GIT_REV_LIST;\r
 \r
 #define LOG_REV_AUTHOR_NAME    _T('0')\r
 #define LOG_REV_AUTHOR_EMAIL   _T('1')\r
@@ -50,7 +51,7 @@ public:
        CTime m_CommitterDate;\r
        CString m_Subject;\r
        CString m_Body;\r
-       git_revnum_t m_CommitHash;\r
+       CGitHash m_CommitHash;\r
        GIT_REV_LIST m_ParentHash;\r
        CTGitPathList m_Files;\r
        int     m_Action;\r
index 2882ba6..95680bf 100644 (file)
@@ -2,6 +2,9 @@
 Microsoft Visual Studio Solution File, Format Version 10.00\r
 # Visual Studio 2008\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Git", "Git\Git.vcproj", "{7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}"\r
+       ProjectSection(ProjectDependencies) = postProject\r
+               {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} = {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F}\r
+       EndProjectSection\r
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TortoiseProc", "TortoiseProc\TortoiseProc.vcproj", "{50797F06-39C5-4802-8E2B-7B7A4EF03214}"\r
        ProjectSection(ProjectDependencies) = postProject\r
index a167e0a..8b0458c 100644 (file)
@@ -13,7 +13,7 @@ CLogCache::~CLogCache()
 }\r
 int CLogCache::AddCacheEntry(GitRev &Rev)\r
 {\r
-       this->m_NewCacheEntry.push_back(Rev);\r
+       this->m_HashMap[Rev.m_CommitHash] = Rev;\r
        return 0;\r
 }\r
 \r
@@ -21,13 +21,10 @@ int CLogCache::GetCacheData(GitRev &Rev)
 {\r
        if(this->m_HashMapIndex.find(Rev.m_CommitHash)==m_HashMapIndex.end())\r
        {\r
-               for(int i=0;i<this->m_NewCacheEntry.size();i++)\r
+               if(this->m_HashMap.IsExist(Rev.m_CommitHash))\r
                {\r
-                       if(m_NewCacheEntry[i].m_CommitHash==Rev.m_CommitHash)\r
-                       {\r
-                               Rev.CopyFrom(m_NewCacheEntry[i],true);\r
-                               return 0;\r
-                       }\r
+                       Rev.CopyFrom(m_HashMap[Rev.m_CommitHash]);\r
+                       return 0;\r
                }\r
                return -1;\r
        }\r
@@ -78,9 +75,7 @@ int CLogCache::FetchCacheIndex(CString GitDir)
                if( count != sizeof(SLogCacheItem) )\r
                        break;\r
 \r
-               CString str;\r
-               g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);\r
-               this->m_HashMapIndex[str]=Item.m_Offset;\r
+               this->m_HashMapIndex[Item.m_Hash]=Item.m_Offset;\r
        }\r
 \r
        return 0;\r
@@ -225,7 +220,7 @@ int CLogCache::RebuildCacheFile()
 }\r
 int CLogCache::SaveCache()\r
 {\r
-       if( this->m_NewCacheEntry.size() == 0 )\r
+       if( this->m_HashMap.size() == 0 )\r
                return 0;\r
 \r
        bool bIsRebuild=false;\r
@@ -283,19 +278,22 @@ int CLogCache::SaveCache()
 \r
        m_DataFile.SeekToEnd();\r
        m_IndexFile.SeekToEnd();\r
-       for(int i=0;i<this->m_NewCacheEntry.size();i++)\r
+       CGitHashMap::iterator i;\r
+       for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
        {\r
-               if(this->m_HashMapIndex.find(m_NewCacheEntry[i].m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
+               if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
                {\r
-                       ULONGLONG offset = m_DataFile.GetPosition();\r
-                       this->SaveOneItem(m_NewCacheEntry[i],offset);\r
+                       if((*i).second.m_IsFull)\r
+                       {\r
+                               ULONGLONG offset = m_DataFile.GetPosition();\r
+                               this->SaveOneItem((*i).second,offset);\r
 \r
-                       SLogCacheItem item;\r
-                       for(int j=0; j<40;j++)\r
-                               item.m_Hash[j]=(BYTE)m_NewCacheEntry[i].m_CommitHash[j];\r
-                       item.m_Offset=offset;\r
+                               SLogCacheItem item;\r
+                               item.m_Hash = (*i).second.m_CommitHash;\r
+                               item.m_Offset=offset;\r
 \r
-                       m_IndexFile.Write(&item,sizeof(SLogCacheItem));\r
+                               m_IndexFile.Write(&item,sizeof(SLogCacheItem));\r
+                       }\r
                }\r
        }\r
        m_IndexFile.Close();\r
index ac88137..21558cc 100644 (file)
@@ -53,7 +53,7 @@ IMPLEMENT_DYNAMIC(CGitLogList, CHintListCtrl)
 \r
 int CGitLogList::CherryPickFrom(CString from, CString to)\r
 {\r
-       CLogDataVector logs;\r
+       CLogDataVector logs(&m_LogCache);\r
        if(logs.ParserFromLog(NULL,-1,0,&from,&to))\r
                return -1;\r
 \r
@@ -73,8 +73,8 @@ int CGitLogList::CherryPickFrom(CString from, CString to)
        {\r
                if (progress.IsValid())\r
                {\r
-                       progress.FormatPathLine(1, _T("Pick up %s"), logs[i].m_CommitHash);\r
-                       progress.FormatPathLine(2, _T("%s"), logs[i].m_Subject);\r
+                       progress.FormatPathLine(1, _T("Pick up %s"), logs.GetGitRevAt(i).m_CommitHash);\r
+                       progress.FormatPathLine(2, _T("%s"), logs.GetGitRevAt(i).m_Subject);\r
                        progress.SetProgress(logs.size()-i, logs.size());\r
                }\r
                if ((progress.IsValid())&&(progress.HasUserCancelled()))\r
@@ -84,7 +84,7 @@ int CGitLogList::CherryPickFrom(CString from, CString to)
                        return -1;\r
                }\r
                CString cmd,out;\r
-               cmd.Format(_T("git.exe cherry-pick %s"),logs[i].m_CommitHash);\r
+               cmd.Format(_T("git.exe cherry-pick %s"),logs.GetGitRevAt(i).m_CommitHash);\r
                out.Empty();\r
                if(g_Git.Run(cmd,&out,CP_UTF8))\r
                {\r
@@ -124,14 +124,14 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                                CString tempfile=GetTempFile();\r
                                CString cmd;\r
                                GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
-                               if(r1->m_CommitHash != GIT_REV_ZERO)\r
+                               if(!r1->m_CommitHash.IsEmpty())\r
                                {\r
                                        cmd.Format(_T("git.exe diff-tree -r -p --stat %s"),r1->m_CommitHash);\r
                                }else\r
                                        cmd.Format(_T("git.exe diff -r -p --stat"));\r
 \r
                                g_Git.RunLogFile(cmd,tempfile);\r
-                               CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r1->m_Subject);\r
+                               CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.ToString().Left(6)+_T(":")+r1->m_Subject);\r
                        }\r
                        break;\r
 \r
@@ -142,17 +142,17 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                                GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
                                GitRev * r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
                                \r
-                               if( r1->m_CommitHash == GIT_REV_ZERO)\r
+                               if( r1->m_CommitHash.IsEmpty())\r
                                {\r
                                        cmd.Format(_T("git.exe diff -r -p --stat %s"),r2->m_CommitHash);\r
-                               }else if( r2->m_CommitHash == GIT_REV_ZERO)\r
+                               }else if( r2->m_CommitHash.IsEmpty())\r
                                {\r
                                        cmd.Format(_T("git.exe diff -r -p --stat %s"),r1->m_CommitHash);\r
                                }else\r
                                        cmd.Format(_T("git.exe diff-tree -r -p --stat %s %s"),r1->m_CommitHash,r2->m_CommitHash);\r
 \r
                                g_Git.RunLogFile(cmd,tempfile);\r
-                               CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r2->m_CommitHash.Left(6));\r
+                               CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.ToString().Left(6)+_T(":")+r2->m_CommitHash.ToString().Left(6));\r
 \r
                        }\r
                        break;\r
@@ -198,7 +198,7 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                                if(pSelLogEntry->m_ParentHash.size()>0)\r
                                //if(m_logEntries.m_HashMap[pSelLogEntry->m_ParentHash[0]]>=0)\r
                                {\r
-                                       dlg.SetDiff(NULL,pSelLogEntry->m_CommitHash,pSelLogEntry->m_ParentHash[0]);\r
+                                       dlg.SetDiff(NULL,pSelLogEntry->m_CommitHash.ToString(),pSelLogEntry->m_ParentHash[0].ToString());\r
                                        dlg.DoModal();\r
                                }else\r
                                {\r
@@ -226,25 +226,25 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                        }\r
                        break;\r
                case ID_EXPORT:\r
-                       CAppUtils::Export(&pSelLogEntry->m_CommitHash);\r
+                       CAppUtils::Export(&pSelLogEntry->m_CommitHash.ToString());\r
                        break;\r
                case ID_CREATE_BRANCH:\r
-                       CAppUtils::CreateBranchTag(FALSE,&pSelLogEntry->m_CommitHash);\r
+                       CAppUtils::CreateBranchTag(FALSE,&pSelLogEntry->m_CommitHash.ToString());\r
                        ReloadHashMap();\r
                        Invalidate();                   \r
                        break;\r
                case ID_CREATE_TAG:\r
-                       CAppUtils::CreateBranchTag(TRUE,&pSelLogEntry->m_CommitHash);\r
+                       CAppUtils::CreateBranchTag(TRUE,&pSelLogEntry->m_CommitHash.ToString());\r
                        ReloadHashMap();\r
                        Invalidate();\r
                        break;\r
                case ID_SWITCHTOREV:\r
-                       CAppUtils::Switch(&pSelLogEntry->m_CommitHash);\r
+                       CAppUtils::Switch(&pSelLogEntry->m_CommitHash.ToString());\r
                        ReloadHashMap();\r
                        Invalidate();\r
                        break;\r
                case ID_RESET:\r
-                       CAppUtils::GitReset(&pSelLogEntry->m_CommitHash);\r
+                       CAppUtils::GitReset(&pSelLogEntry->m_CommitHash.ToString());\r
                        ReloadHashMap();\r
                        Invalidate();\r
                        break;\r
@@ -413,8 +413,8 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                                while(pos)\r
                                {\r
                                        int indexNext = GetNextSelectedItem(pos);\r
-                                       dlg.m_CommitList.m_logEntries.push_back(*(GitRev*)m_arShownList[indexNext]);\r
-                                       dlg.m_CommitList.m_logEntries.at(dlg.m_CommitList.m_logEntries.size()-1).m_Action |= CTGitPath::LOGACTIONS_REBASE_PICK;\r
+                                       dlg.m_CommitList.m_logEntries.push_back( ((GitRev*)m_arShownList[indexNext])->m_CommitHash );\r
+                                       dlg.m_CommitList.m_logEntries.GetGitRevAt(dlg.m_CommitList.m_logEntries.size()-1).m_Action |= CTGitPath::LOGACTIONS_REBASE_PICK;\r
                                }\r
        \r
                                if(dlg.DoModal() == IDOK)\r
@@ -474,20 +474,20 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                                GitRev * r2 = NULL;\r
                                if(select == 1)\r
                                {\r
-                                       cmd += _T(" /startrev:")+r1->m_CommitHash;\r
+                                       cmd += _T(" /startrev:")+r1->m_CommitHash.ToString();\r
                                }\r
                                else \r
                                {\r
                                        r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
                                        if( this->m_IsOldFirst )\r
                                        {       \r
-                                               cmd += _T(" /startrev:")+r1->m_CommitHash+_T("~1");\r
-                                               cmd += _T(" /endrev:")+r2->m_CommitHash;\r
+                                               cmd += _T(" /startrev:")+r1->m_CommitHash.ToString()+_T("~1");\r
+                                               cmd += _T(" /endrev:")+r2->m_CommitHash.ToString();\r
        \r
                                        }else\r
                                        {       \r
-                                               cmd += _T(" /startrev:")+r2->m_CommitHash+_T("~1");\r
-                                               cmd += _T(" /endrev:")+r1->m_CommitHash;        \r
+                                               cmd += _T(" /startrev:")+r2->m_CommitHash.ToString()+_T("~1");\r
+                                               cmd += _T(" /endrev:")+r1->m_CommitHash.ToString();     \r
                                        }                               \r
                                        \r
                                }\r
index f4e2314..bc888ec 100644 (file)
@@ -59,6 +59,7 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
        , m_nSelectedFilter(LOGFILTER_ALL)\r
        , m_bVista(false)\r
        , m_bShowWC(false)\r
+       , m_logEntries(&m_LogCache)\r
 {\r
        // use the default GUI font, create a copy of it and\r
        // change the copy to BOLD (leave the rest of the font\r
@@ -73,7 +74,7 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
 \r
        m_IsIDReplaceAction=FALSE;\r
 \r
-       m_wcRev.m_CommitHash=GIT_REV_ZERO;\r
+       m_wcRev.m_CommitHash.Empty();\r
        m_wcRev.m_Subject=_T("Working dir changes");\r
        m_wcRev.m_ParentHash.clear();\r
        m_wcRev.m_Mark=_T('-');\r
@@ -823,7 +824,7 @@ void CGitLogListBase::DrawGraph(HDC hdc,CRect &rect,INT_PTR index)
 \r
 \r
        if (data->m_Lanes.size() == 0)\r
-               m_logEntries.setLane(data->m_CommitHash);\r
+               m_logEntries.setLane(data->m_CommitHash.ToString());\r
 \r
        std::vector<int>& lanes=data->m_Lanes;\r
        UINT laneNum = lanes.size();\r
@@ -951,7 +952,7 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
 //                                     if ((data->childStackDepth)||(m_mergedRevs.find(data->Rev) != m_mergedRevs.end()))\r
 //                                             crText = GetSysColor(COLOR_GRAYTEXT);\r
 //                                     \r
-                                       if (data->m_CommitHash == GIT_REV_ZERO)\r
+                                       if (data->m_CommitHash.IsEmpty())\r
                                        {\r
                                                //crText = GetSysColor(RGB(200,200,0));\r
                                                //SelectObject(pLVCD->nmcd.hdc, m_boldFont);\r
@@ -995,7 +996,7 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                                        FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);\r
                                        \r
                                        GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);\r
-                                       if( data ->m_CommitHash != GIT_REV_ZERO)\r
+                                       if( !data ->m_CommitHash.IsEmpty())\r
                                                DrawGraph(pLVCD->nmcd.hdc,rect,pLVCD->nmcd.dwItemSpec);\r
 \r
                                        *pResult = CDRF_SKIPDEFAULT;\r
@@ -1151,7 +1152,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 != GIT_REV_ZERO)\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
@@ -1276,7 +1277,7 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
                {\r
                        \r
                        {\r
-                               if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+                               if( !pSelLogEntry->m_CommitHash.IsEmpty())\r
                                {\r
                                        if(m_ContextMenuMask&GetContextMenuBit(ID_COMPARE))\r
                                                popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARE, IDI_DIFF);\r
@@ -1326,7 +1327,7 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
                        format.LoadString(IDS_RESET_TO_THIS_FORMAT);\r
                        str.Format(format,g_Git.GetCurrentBranch());\r
 \r
-                       if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+                       if(!pSelLogEntry->m_CommitHash.IsEmpty())\r
                        {\r
                                if(m_ContextMenuMask&GetContextMenuBit(ID_RESET))\r
                                        popup.AppendMenuIcon(ID_RESET,str,IDI_REVERT);\r
@@ -1391,7 +1392,7 @@ void CGitLogListBase::OnContextMenu(CWnd* pWnd, CPoint point)
                                popup.AppendMenu(MF_SEPARATOR, NULL);\r
                }\r
 \r
-               if ( GetSelectedCount() >0 && pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+               if ( GetSelectedCount() >0 && (!pSelLogEntry->m_CommitHash.IsEmpty()))\r
                {\r
                        if ( IsSelectionContinuous() && GetSelectedCount() >= 2 )\r
                        {\r
@@ -1726,12 +1727,12 @@ int CGitLogListBase::FillGitLog(CTGitPath *path,int info,CString *from,CString *
        {\r
                if(m_IsOldFirst)\r
                {\r
-                       m_logEntries[m_logEntries.size()-i-1].m_IsFull=TRUE;\r
+                       m_logEntries.GetGitRevAt(m_logEntries.size()-i-1).m_IsFull=TRUE;\r
                        this->m_arShownList.Add(&m_logEntries[m_logEntries.size()-i-1]);\r
                \r
                }else\r
                {\r
-                       m_logEntries[i].m_IsFull=TRUE;\r
+                       m_logEntries.GetGitRevAt(i).m_IsFull=TRUE;\r
                        this->m_arShownList.Add(&m_logEntries[i]);\r
                }\r
        }\r
@@ -1763,7 +1764,7 @@ int CGitLogListBase::FillGitShortLog()
        mask |= m_ShowMask;\r
        \r
        if(m_bShowWC)\r
-               this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev);\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
 \r
@@ -1781,8 +1782,8 @@ int CGitLogListBase::FillGitShortLog()
 \r
        for(unsigned int i=0;i<m_logEntries.size();i++)\r
        {\r
-               if(i>0 || m_logEntries[i].m_CommitHash != GIT_REV_ZERO)\r
-                       m_logEntries[i].m_Subject=_T("parser...");\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
@@ -1871,11 +1872,11 @@ 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].m_AuthorDate.GetTime() < oldest.GetTime())\r
-                       oldest = m_logEntries[i].m_AuthorDate.GetTime();\r
+               if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() < oldest.GetTime())\r
+                       oldest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
 \r
-               if(m_logEntries[i].m_AuthorDate.GetTime() > latest.GetTime())\r
-                       latest = m_logEntries[i].m_AuthorDate.GetTime();\r
+               if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() > latest.GetTime())\r
+                       latest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
 \r
        }\r
 }\r
@@ -1929,17 +1930,17 @@ public:
                }\r
                //Set updating\r
                int rev=itRev->second;\r
-               GitRev* revInVector=&m_ploglist->m_logEntries[rev];\r
+               GitRev* revInVector=&m_ploglist->m_logEntries.GetGitRevAt(rev);\r
 \r
 \r
                if(revInVector->m_IsFull)\r
                        return;\r
 \r
-               if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries[rev]))\r
+               if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries.GetGitRevAt(rev)))\r
                {\r
                        ++m_CollectedCount;\r
-                       InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsUpdateing,FALSE);\r
-                       InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsFull,TRUE);\r
+                       InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsUpdateing,FALSE);\r
+                       InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsFull,TRUE);\r
                        ::PostMessage(m_ploglist->m_hWnd,MSG_LOADED,(WPARAM)rev,0);\r
                        return;\r
                }\r
@@ -2015,22 +2016,22 @@ void CGitLogListBase::FetchLastLogInfo()
        {\r
                for(unsigned int i=0;i<m_logEntries.size();i++)\r
                {\r
-                       if(m_logEntries[i].m_IsFull)\r
+                       if(m_logEntries.GetGitRevAt(i).m_IsFull)\r
                                continue;\r
 \r
-                       if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+                       if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
                        {\r
                                if(!m_logEntries.FetchFullInfo(i))\r
                                {\r
                                        updated++;\r
                                }\r
-                               m_LogCache.AddCacheEntry(m_logEntries[i]);\r
+                               m_LogCache.AddCacheEntry(m_logEntries.GetGitRevAt(i));\r
 \r
                        }else\r
                        {\r
                                updated++;\r
-                               InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
-                               InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+                               InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
+                               InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsFull,TRUE);\r
                        }\r
                        \r
                        ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)i,0);\r
@@ -2077,25 +2078,25 @@ UINT CGitLogListBase::LogThread()
        int update=0;\r
        for(int i=0;i<m_logEntries.size();i++)\r
        {\r
-               if( i==0 && m_logEntries[i].m_CommitHash == GIT_REV_ZERO)\r
+               if( i==0 && m_logEntries.GetGitRevAt(i).m_CommitHash.IsEmpty() )\r
                {\r
-                       m_logEntries[i].m_Files.Clear();\r
-                       m_logEntries[i].m_ParentHash.clear();\r
-                       m_logEntries[i].m_ParentHash.push_back(m_HeadHash);\r
-                       g_Git.GetCommitDiffList(m_logEntries[i].m_CommitHash,this->m_HeadHash,m_logEntries[i].m_Files);\r
-                       m_logEntries[i].m_Action =0;\r
-                       for(int j=0;j< m_logEntries[i].m_Files.GetCount();j++)\r
-                               m_logEntries[i].m_Action |= m_logEntries[i].m_Files[j].m_Action;\r
+                       m_logEntries.GetGitRevAt(i).m_Files.Clear();\r
+                       m_logEntries.GetGitRevAt(i).m_ParentHash.clear();\r
+                       m_logEntries.GetGitRevAt(i).m_ParentHash.push_back(m_HeadHash);\r
+                       g_Git.GetCommitDiffList(m_logEntries.GetGitRevAt(i).m_CommitHash,this->m_HeadHash,m_logEntries.GetGitRevAt(i).m_Files);\r
+                       m_logEntries.GetGitRevAt(i).m_Action =0;\r
+                       for(int j=0;j< m_logEntries.GetGitRevAt(i).m_Files.GetCount();j++)\r
+                               m_logEntries.GetGitRevAt(i).m_Action |= m_logEntries.GetGitRevAt(i).m_Files[j].m_Action;\r
                        \r
-                       m_logEntries[i].m_Body.Format(_T("%d files changed"),m_logEntries[i].m_Files.GetCount());\r
+                       m_logEntries.GetGitRevAt(i).m_Body.Format(_T("%d files changed"),m_logEntries.GetGitRevAt(i).m_Files.GetCount());\r
                        ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)0,0);\r
                        continue;\r
                }\r
 \r
-               start=this->m_logEntries[i].ParserFromLog(m_logEntries.m_RawlogData,start);\r
+               start=this->m_logEntries.GetGitRevAt(i).ParserFromLog(m_logEntries.m_RawlogData,start);\r
                m_logEntries.m_HashMap[m_logEntries[i].m_CommitHash]=i;\r
 \r
-               if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+               if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
                {\r
                        if(firstcommit.IsEmpty())\r
                                firstcommit=m_logEntries[i].m_CommitHash;\r
@@ -2103,8 +2104,8 @@ UINT CGitLogListBase::LogThread()
 \r
                }else\r
                {\r
-                       InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
-                       InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+                       InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
+                       InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsFull,TRUE);\r
                        update++;\r
                }\r
                ::PostMessage(m_hWnd,MSG_LOADED,(WPARAM) i, 0);\r
index 35057e4..8e9214d 100644 (file)
@@ -62,6 +62,8 @@
 //#include "RepositoryInfo.h"\r
 //#include "EditPropertiesDlg.h"\r
 #include "FileDiffDlg.h"\r
+#include "GitHash.h"\r
+CGitHashMap a;\r
 \r
 void CLogDataVector::ClearAll()\r
 {\r
index 1b0e56c..ce2db33 100644 (file)
@@ -23,7 +23,8 @@
 #include "ILogReceiver.h"\r
 #include "lanes.h"\r
 #include <set> \r
-\r
+#include "GitHash.h"\r
+#include "GitLogCache.h"\r
 class CLogDlg;\r
 \r
 /**\r
@@ -49,14 +50,21 @@ protected:
  * Helper class for the log dialog, handles all the log entries, including\r
  * sorting.\r
  */\r
-class CLogDataVector :         public std::vector<GitRev>\r
+class CLogDataVector :         public std::vector<CGitHash>\r
 {\r
 public:\r
+       CLogCache *m_pLogCache;\r
        /// De-allocates log items.\r
-       CLogDataVector()\r
+       CLogDataVector(CLogCache *pLogCache)\r
        {\r
+               m_pLogCache=pLogCache;\r
                m_FirstFreeLane=0;\r
        }\r
+       GitRev & GetGitRevAt(int i)\r
+       {\r
+               ASSERT(i<size());\r
+               return  m_pLogCache->m_HashMap[(*this)[i]];\r
+       }\r
        void ClearAll();\r
        int  ParserFromLog(CTGitPath *path =NULL,int count = -1,int infomask=CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_SHOW_MERGEDFILE,\r
                                                                                         CString *from=NULL,CString *to=NULL);\r
index e29bd60..b2c9177 100644 (file)
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\copy.ico"\r
+                               RelativePath="..\Resources\copy.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\copy.ico"\r
+                               RelativePath=".\copy.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\explorer.ico"\r
+                               RelativePath=".\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\explorer.ico"\r
+                               RelativePath="..\Resources\explorer.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\newfolder.ico"\r
+                               RelativePath="..\Resources\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\newfolder.ico"\r
+                               RelativePath=".\newfolder.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\refresh.ico"\r
+                               RelativePath="..\Resources\refresh.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\refresh.ico"\r
+                               RelativePath=".\refresh.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\save.ico"\r
+                               RelativePath=".\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\save.ico"\r
+                               RelativePath="..\Resources\save.ico"\r
                                >\r
                        </File>\r
                        <File\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath=".\up.ico"\r
+                               RelativePath="..\Resources\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\Resources\up.ico"\r
+                               RelativePath=".\up.ico"\r
                                >\r
                        </File>\r
                        <File\r
index 84f055c..e79f346 100644 (file)
@@ -3,12 +3,13 @@
 #include "Git.h"\r
 #include "TGitPath.h"\r
 #include "GitRev.h"\r
+#include "GitHash.h"\r
 \r
 #define LOG_INDEX_MAGIC                0x88445566\r
 #define LOG_DATA_MAGIC         0x99aa00FF\r
 #define LOG_DATA_ITEM_MAGIC 0x0F8899CC\r
 #define LOG_DATA_FILE_MAGIC 0x19999FFF\r
-#define LOG_INDEX_VERSION   0x\r
+#define LOG_INDEX_VERSION   0x7\r
 \r
 struct SLogCacheIndexHeader \r
 {\r
@@ -19,7 +20,7 @@ struct SLogCacheIndexHeader
 \r
 struct SLogCacheItem\r
 {\r
-       BYTE  m_Hash[40];\r
+       CGitHash  m_Hash;\r
        ULONGLONG m_Offset;\r
 };\r
 \r
@@ -36,6 +37,15 @@ struct SLogCacheRevItemHeader
        DWORD m_FileCount;\r
 };\r
 \r
+class CGitHashMap:public std::map<CGitHash,GitRev>\r
+{\r
+public:\r
+       bool IsExist(CGitHash &hash)\r
+       {\r
+               return find(hash) != end();\r
+       }\r
+};\r
+\r
 #define INDEX_FILE_NAME _T("tortoisegit.index")\r
 #define DATA_FILE_NAME _T("tortoisegit.data")\r
 #define LOCK_FILE_NAME _T("tortoisegit.lock")\r
@@ -89,8 +99,10 @@ public:
        CLogCache();\r
        ~CLogCache();\r
        int FetchCacheIndex(CString GitDir);\r
-       std::vector<GitRev> m_NewCacheEntry;\r
-       std::map<CString, ULONGLONG> m_HashMapIndex;\r
+\r
+       CGitHashMap m_HashMap;\r
+       std::map<CGitHash, ULONGLONG> m_HashMapIndex;\r
+\r
        int GetCacheData(GitRev &Rev);\r
        int AddCacheEntry(GitRev &Rev);\r
        int SaveCache();\r
index f59322f..078d52d 100644 (file)
@@ -281,7 +281,7 @@ void CGitPropertyPage::InitWorkfileView()
        SetDlgItemText(m_hwnd,IDC_SHELL_CURRENT_BRANCH,branch);\r
        SetDlgItemText(m_hwnd,IDC_SHELL_REMOTE_BRANCH,remotebranch);\r
 \r
-       SetDlgItemText(m_hwnd,IDC_HEAD_HASH,rev.m_CommitHash);\r
+       SetDlgItemText(m_hwnd,IDC_HEAD_HASH,rev.m_CommitHash.ToString());\r
        SetDlgItemText(m_hwnd,IDC_HEAD_SUBJECT,rev.m_Subject);\r
        SetDlgItemText(m_hwnd,IDC_HEAD_AUTHOR,rev.m_AuthorName);\r
        SetDlgItemText(m_hwnd,IDC_HEAD_DATE,rev.m_AuthorDate.Format(_T("%Y-%m-%d %H:%M:%S")));\r
@@ -313,7 +313,7 @@ void CGitPropertyPage::InitWorkfileView()
                rev.Clear();\r
                rev.ParserFromLog(logout);\r
 \r
-               SetDlgItemText(m_hwnd,IDC_LAST_HASH,rev.m_CommitHash);\r
+               SetDlgItemText(m_hwnd,IDC_LAST_HASH,rev.m_CommitHash.ToString());\r
                SetDlgItemText(m_hwnd,IDC_LAST_SUBJECT,rev.m_Subject);\r
                SetDlgItemText(m_hwnd,IDC_LAST_AUTHOR,rev.m_AuthorName);\r
                SetDlgItemText(m_hwnd,IDC_LAST_DATE,rev.m_AuthorDate.Format(_T("%Y-%m-%d %H:%M:%S")));\r
index d223bb4..e15fe92 100644 (file)
@@ -54,9 +54,9 @@ CTGitPath CTempFiles::GetTempFilePath(bool bRemoveAtEnd, const CTGitPath& path /
                int i=0;\r
                do\r
                {\r
-                       if (!revision.m_CommitHash.IsEmpty())\r
+                       if (!((GitRev&)revision).m_CommitHash.IsEmpty())\r
                        {\r
-                               possibletempfile.Format(_T("%s%s-rev%s.git%3.3x.tmp%s"), temppath, (LPCTSTR)path.GetFileOrDirectoryName(), (LPCTSTR)revision.m_CommitHash.Left(7), i, (LPCTSTR)path.GetFileExtension());\r
+                               possibletempfile.Format(_T("%s%s-rev%s.git%3.3x.tmp%s"), temppath, (LPCTSTR)path.GetFileOrDirectoryName(), (LPCTSTR)((GitRev&)revision).m_CommitHash.ToString().Left(7), i, (LPCTSTR)path.GetFileExtension());\r
                        }\r
                        else\r
                        {\r