OSDN Git Service

Log Cache Compile Okay
authorFrank Li <lznuaa@gmail.com>
Mon, 26 Jan 2009 16:06:47 +0000 (00:06 +0800)
committerFrank Li <lznuaa@gmail.com>
Mon, 26 Jan 2009 16:06:47 +0000 (00:06 +0800)
src/TortoiseProc/GitLogCache.cpp
src/TortoiseProc/gitlogcache.h

index 30e9072..36eff94 100644 (file)
@@ -17,8 +17,8 @@ int CLogCache::FetchCache(CString GitDir)
        if(this->m_IndexFile.m_hFile == CFile::hFileNull)\r
        {\r
                BOOL b=m_IndexFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
-                                               CFile::modeRead|CFile::shareDenyNone|\r
-                                               CFile::modeNoTruncate|CFile::modeCreate);\r
+                       CFile::modeRead|CFile::shareDenyNone|\r
+                       CFile::modeNoTruncate|CFile::modeCreate);\r
                if(!b)\r
                        return -1;\r
        }\r
@@ -40,7 +40,7 @@ int CLogCache::FetchCache(CString GitDir)
        for(int i=0;i<header.m_ItemCount;i++)\r
        {\r
                count=m_IndexFile.Read(&Item,sizeof(SLogCacheItem));    \r
-               if(count != sizeof(SLogCacheItem)\r
+               if( count != sizeof(SLogCacheItem) )\r
                        break;\r
 \r
                CString str;\r
@@ -51,12 +51,59 @@ int CLogCache::FetchCache(CString GitDir)
        return 0;\r
 }\r
 \r
-int CLogCache::SaveOneItem(GitRev &Rev)\r
+int CLogCache::SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
 {\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
+                       CFile::modeRead|CFile::shareDenyNone|\r
+                       CFile::modeNoTruncate|CFile::modeCreate);\r
+               if(!b)\r
+                       return -1;\r
+       }\r
+\r
+       header.m_Magic=LOG_DATA_ITEM_MAGIC;\r
+       header.m_Version=LOG_INDEX_VERSION;\r
+       header.m_FileCount=Rev.m_Files.GetCount();\r
+\r
+       m_DataFile.Write(&header,sizeof(SLogCacheRevItemHeader));\r
+       \r
+       CArchive ar(&m_DataFile, CArchive::store);\r
+\r
+       ar<<Rev.m_AuthorName;\r
+       ar<<Rev.m_AuthorEmail;\r
+       ar<<Rev.m_AuthorDate;\r
+       ar<<Rev.m_CommitterName;\r
+       ar<<Rev.m_CommitterEmail;\r
+       ar<<Rev.m_CommitterDate;\r
+       ar<<Rev.m_Subject;\r
+       ar<<Rev.m_Body;\r
+       ar<<Rev.m_CommitHash;\r
+       ar<<Rev.m_Action;\r
+\r
+       for(int i=0;i<Rev.m_Files.GetCount();i++)\r
+       {\r
+               SLogCacheRevFileHeader header;\r
+               header.m_Magic=LOG_DATA_FILE_MAGIC;\r
+               header.m_Version=LOG_INDEX_VERSION;\r
+\r
+               ar<<header.m_Magic;\r
+               ar<<header.m_Version;\r
+\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
+       return 0;\r
 }\r
 \r
-int CLogCache::LoadOneItem(GitRev &Rev,UINT offset)\r
+int CLogCache::LoadOneItem(CString &GitDir,GitRev &Rev,UINT offset)\r
 {\r
        SLogCacheRevItemHeader header;\r
        m_DataFile.Seek(offset,CFile::begin);\r
@@ -64,8 +111,8 @@ int CLogCache::LoadOneItem(GitRev &Rev,UINT offset)
        if(this->m_DataFile.m_hFile == CFile::hFileNull)\r
        {\r
                BOOL b=m_DataFile.Open(GitDir+_T("\\.git\\")+INDEX_FILE_NAME,\r
-                                               CFile::modeRead|CFile::shareDenyNone|\r
-                                               CFile::modeNoTruncate|CFile::modeCreate);\r
+                       CFile::modeRead|CFile::shareDenyNone|\r
+                       CFile::modeNoTruncate|CFile::modeCreate);\r
                if(!b)\r
                        return -1;\r
        }\r
@@ -75,17 +122,43 @@ int CLogCache::LoadOneItem(GitRev &Rev,UINT offset)
                return -1;\r
        if( !CheckHeader(header))\r
                return -2;\r
-       \r
-       CGitByteArray stream;\r
 \r
-       stream.resize(header.m_RevSize-sizeof(SLogCacheRevItemHeader));\r
 \r
-       count=m_DataFile.Read(&stream[0],stream.size());\r
-       if( count != stream.size)\r
-               return;\r
+       CArchive ar(&m_DataFile, CArchive::load);\r
 \r
-       \r
+       ar>>Rev.m_AuthorName;\r
+       ar>>Rev.m_AuthorEmail;\r
+       ar>>Rev.m_AuthorDate;\r
+       ar>>Rev.m_CommitterName;\r
+       ar>>Rev.m_CommitterEmail;\r
+       ar>>Rev.m_CommitterDate;\r
+       ar>>Rev.m_Subject;\r
+       ar>>Rev.m_Body;\r
+       ar>>Rev.m_CommitHash;\r
+       ar>>Rev.m_Action;\r
 \r
+       Rev.m_Files.Clear();\r
 \r
-       \r
+       for(int i=0;i<header.m_FileCount;i++)\r
+       {\r
+               CTGitPath path;\r
+               CString file;\r
+               path.Reset();\r
+               SLogCacheRevFileHeader header;\r
+\r
+               ar>>header.m_Magic;\r
+               ar>>header.m_Version;\r
+\r
+               if( this->CheckHeader(header) )\r
+                       return -1;\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
+               Rev.m_Files.AddPath(path);\r
+       }\r
+       return 0;\r
 }
\ No newline at end of file
index c3da454..a0d9ecc 100644 (file)
@@ -7,6 +7,7 @@
 #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 0x1\r
 \r
 struct SLogCacheIndexHeader \r
@@ -32,7 +33,6 @@ struct SLogCacheRevItemHeader
 {\r
        DWORD m_Magic;\r
        DWORD m_Version;\r
-       DWORD m_RevSize;\r
        DWORD m_FileCount;\r
 };\r
 \r
@@ -74,8 +74,8 @@ protected:
 \r
        }\r
 \r
-       int SaveOneItem(GitRev &Rev);\r
-       int LoadOneItem(GitRev &Rev,UINT offset);\r
+       int SaveOneItem(CString &GitDir,GitRev &Rev,UINT offset);\r
+       int LoadOneItem(CString &GitDir,GitRev &Rev,UINT offset);\r
 \r
 public:\r
        CLogCache();\r