OSDN Git Service

give up save cache when m_GitDir is empty
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogCache.cpp
index 36eff94..0ba88b9 100644 (file)
@@ -8,12 +8,43 @@ CLogCache::CLogCache()
 \r
 CLogCache::~CLogCache()\r
 {\r
-       this->m_IndexFile.Close();\r
-       this->m_DataFile.Close();\r
+       //this->m_IndexFile.Close();\r
+       //this->m_DataFile.Close();\r
+}\r
+int CLogCache::AddCacheEntry(GitRev &Rev)\r
+{\r
+       this->m_HashMap[Rev.m_CommitHash] = Rev;\r
+       return 0;\r
 }\r
 \r
-int CLogCache::FetchCache(CString GitDir)\r
+GitRev * CLogCache::GetCacheData(CGitHash &hash)\r
+{\r
+       if(this->m_HashMapIndex.find(hash)==m_HashMapIndex.end())\r
+       {\r
+               if(this->m_HashMap.IsExist(hash))\r
+               {\r
+                       return &m_HashMap[hash];\r
+               }\r
+               m_HashMap[hash].m_CommitHash=hash;\r
+               return &m_HashMap[hash];\r
+       }\r
+       else\r
+       {\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
+       m_HashMap[hash].m_CommitHash=hash;\r
+       return &m_HashMap[hash];\r
+}\r
+int CLogCache::FetchCacheIndex(CString GitDir)\r
 {\r
+\r
        if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
        {\r
                BOOL b=m_IndexFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
@@ -22,6 +53,12 @@ int CLogCache::FetchCache(CString GitDir)
                if(!b)\r
                        return -1;\r
        }\r
+       //Cache has been fetched.\r
+       //if(m_GitDir == GitDir)\r
+       //      return 0;\r
+\r
+       m_GitDir=GitDir;\r
+       m_IndexFile.SeekToBegin();\r
 \r
        SLogCacheIndexHeader header;\r
        UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));\r
@@ -37,21 +74,22 @@ int CLogCache::FetchCache(CString GitDir)
 \r
        SLogCacheItem Item;\r
 \r
-       for(int i=0;i<header.m_ItemCount;i++)\r
+       //for(int i=0;i<header.m_ItemCount;i++)\r
+       this->m_HashMapIndex.clear();\r
+\r
+       while(1)\r
        {\r
                count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem));    \r
                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
 }\r
 \r
-int CLogCache::SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
+int CLogCache::SaveOneItem(GitRev &Rev,ULONGLONG offset)\r
 {\r
        \r
        SLogCacheRevItemHeader header;\r
@@ -59,7 +97,7 @@ int CLogCache::SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset)
 \r
        if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
        {\r
-               BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
+               BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
                        CFile::modeRead|CFile::shareDenyNone|\r
                        CFile::modeNoTruncate|CFile::modeCreate);\r
                if(!b)\r
@@ -93,29 +131,30 @@ int CLogCache::SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset)
 \r
                ar<<header.m_Magic;\r
                ar<<header.m_Version;\r
-\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
                ar<<Rev.m_Files[i].m_StatDel;\r
-               ar<<Rev.m_Files[i].GetGitPathString();\r
+               \r
        }\r
        return 0;\r
 }\r
 \r
-int CLogCache::LoadOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
+int CLogCache::LoadOneItem(GitRev &Rev,ULONGLONG offset)\r
 {\r
        SLogCacheRevItemHeader header;\r
-       m_DataFile.Seek(offset,CFile::begin);\r
 \r
        if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
        {\r
-               BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
+               BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,\r
                        CFile::modeRead|CFile::shareDenyNone|\r
                        CFile::modeNoTruncate|CFile::modeCreate);\r
                if(!b)\r
                        return -1;\r
        }\r
+       m_DataFile.Seek(offset,CFile::begin);\r
 \r
        UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevItemHeader));\r
        if( count != sizeof(SLogCacheRevItemHeader))\r
@@ -142,7 +181,7 @@ int CLogCache::LoadOneItem(CString &GitDir,GitRev &Rev,UINT 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
@@ -151,14 +190,135 @@ int CLogCache::LoadOneItem(CString &GitDir,GitRev &Rev,UINT offset)
 \r
                if( this->CheckHeader(header) )\r
                        return -1;\r
+               ar>>file;\r
+               ar>>oldfile;\r
+               path.SetFromGit(file,&oldfile);\r
 \r
                ar>>path.m_Action;\r
                ar>>path.m_Stage;\r
                ar>>path.m_StatAdd;\r
                ar>>path.m_StatDel;\r
-               ar>>file;\r
-               path.SetFromGit(file);\r
+               \r
+               \r
                Rev.m_Files.AddPath(path);\r
        }\r
        return 0;\r
+}\r
+int CLogCache::RebuildCacheFile()\r
+{\r
+       m_IndexFile.SetLength(0);\r
+       m_DataFile.SetLength(0);\r
+       {\r
+               SLogCacheIndexHeader header;\r
+               header.m_Magic=LOG_INDEX_MAGIC;\r
+               header.m_Version=LOG_INDEX_VERSION;\r
+               m_IndexFile.SeekToBegin();\r
+               m_IndexFile.Write(&header,sizeof(SLogCacheIndexHeader));\r
+       }\r
+       \r
+       {\r
+               SLogCacheRevFileHeader header;\r
+               header.m_Magic=LOG_DATA_MAGIC;\r
+               header.m_Version=LOG_INDEX_VERSION;\r
+\r
+               m_DataFile.SeekToBegin();\r
+               m_DataFile.Write(&header,sizeof(SLogCacheRevFileHeader));\r
+       }\r
+       return 0;\r
+}\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
+       if(this->m_IndexFile.m_hFile!=CFile::hFileNull)\r
+               m_IndexFile.Close();\r
+\r
+       if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
+       {\r
+               BOOL b=m_IndexFile.Open(m_GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
+                       CFile::modeReadWrite|CFile::shareDenyWrite|\r
+                       CFile::modeNoTruncate|CFile::modeCreate);\r
+               if(!b)\r
+                       return -1;\r
+       }\r
+\r
+       if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
+       {\r
+               BOOL b=m_DataFile.Open(m_GitDir+_T("\\.git\\")+DATA_FILE_NAME,\r
+                       CFile::modeReadWrite|CFile::shareDenyWrite|\r
+                       CFile::modeNoTruncate|CFile::modeCreate);\r
+\r
+               \r
+               if(!b)\r
+               {\r
+                       m_IndexFile.Close();\r
+                       return -1;\r
+               }\r
+       }\r
+\r
+       {\r
+               SLogCacheIndexHeader header;\r
+               memset(&header,0,sizeof(SLogCacheIndexHeader));\r
+               UINT count=m_IndexFile.Read(&header,sizeof(SLogCacheIndexHeader));\r
+               if(count != sizeof(SLogCacheIndexHeader) || !this->CheckHeader(header))\r
+               {// new file\r
+                       RebuildCacheFile();\r
+                       bIsRebuild=true;\r
+               }\r
+       }\r
+\r
+       {\r
+\r
+               SLogCacheRevFileHeader header;\r
+       \r
+               UINT count=m_DataFile.Read(&header,sizeof(SLogCacheRevFileHeader));\r
+               if( count != sizeof(SLogCacheRevFileHeader) || !CheckHeader(header))\r
+               {\r
+                       RebuildCacheFile();\r
+                       bIsRebuild=true;\r
+               }\r
+       \r
+       }\r
+\r
+       m_DataFile.SeekToEnd();\r
+       m_IndexFile.SeekToEnd();\r
+       CGitHashMap::iterator i;\r
+       for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
+       {\r
+               if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
+               {\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
+                               item.m_Hash = (*i).second.m_CommitHash;\r
+                               item.m_Offset=offset;\r
+\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