OSDN Git Service

give up save cache when m_GitDir is empty
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogCache.cpp
index 0e022ae..0ba88b9 100644 (file)
@@ -13,29 +13,34 @@ 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
-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
-               for(int i=0;i<this->m_NewCacheEntry.size();i++)\r
+               if(this->m_HashMap.IsExist(hash))\r
                {\r
-                       if(m_NewCacheEntry[i].m_CommitHash==Rev.m_CommitHash)\r
-                       {\r
-                               Rev.CopyFrom(m_NewCacheEntry[i],true);\r
-                               return 0;\r
-                       }\r
+                       return &m_HashMap[hash];\r
                }\r
-               return -1;\r
+               m_HashMap[hash].m_CommitHash=hash;\r
+               return &m_HashMap[hash];\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
+                       m_HashMap[hash].CopyFrom(rev);\r
+                       m_HashMap[hash].m_IsFull=true;\r
+                       \r
+                       return &m_HashMap[hash];\r
+               }\r
        }\r
-       return 0;\r
+       m_HashMap[hash].m_CommitHash=hash;\r
+       return &m_HashMap[hash];\r
 }\r
 int CLogCache::FetchCacheIndex(CString GitDir)\r
 {\r
@@ -78,9 +83,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
@@ -129,6 +132,7 @@ int CLogCache::SaveOneItem(GitRev &Rev,ULONGLONG offset)
                ar<<header.m_Magic;\r
                ar<<header.m_Version;\r
                ar<<Rev.m_Files[i].GetGitPathString();\r
+               ar<<Rev.m_Files[i].GetGitOldPathString();\r
                ar<<Rev.m_Files[i].m_Action;\r
                ar<<Rev.m_Files[i].m_Stage;\r
                ar<<Rev.m_Files[i].m_StatAdd;\r
@@ -177,7 +181,7 @@ int CLogCache::LoadOneItem(GitRev &Rev,ULONGLONG offset)
        for(int i=0;i<header.m_FileCount;i++)\r
        {\r
                CTGitPath path;\r
-               CString file;\r
+               CString file,oldfile;\r
                path.Reset();\r
                SLogCacheRevFileHeader header;\r
 \r
@@ -187,7 +191,8 @@ int CLogCache::LoadOneItem(GitRev &Rev,ULONGLONG offset)
                if( this->CheckHeader(header) )\r
                        return -1;\r
                ar>>file;\r
-               path.SetFromGit(file);\r
+               ar>>oldfile;\r
+               path.SetFromGit(file,&oldfile);\r
 \r
                ar>>path.m_Action;\r
                ar>>path.m_Stage;\r
@@ -223,6 +228,12 @@ int CLogCache::RebuildCacheFile()
 }\r
 int CLogCache::SaveCache()\r
 {\r
+       if( this->m_HashMap.size() == 0 )\r
+               return 0;\r
+\r
+       if( this->m_GitDir.IsEmpty())\r
+               return 0;\r
+\r
        bool bIsRebuild=false;\r
        if(this->m_DataFile.m_hFile != CFile::hFileNull)\r
                m_DataFile.Close();\r
@@ -278,22 +289,36 @@ 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 && !(*i).second.m_CommitHash.IsEmpty())\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
        m_DataFile.Close();\r
        return 0;\r
+}\r
+\r
+int CLogCache::ClearAllParent()\r
+{\r
+       CGitHashMap::iterator i;\r
+       for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
+       {\r
+               (*i).second.m_ParentHash.clear();\r
+               (*i).second.m_Lanes.clear();\r
+       }\r
+       return 0;\r
 }
\ No newline at end of file