OSDN Git Service

Add conflict handle
[tortoisegit/TortoiseGitJp.git] / src / Git / GitRev.cpp
index f1e4f37..2aaab15 100644 (file)
@@ -1,10 +1,12 @@
 #include "StdAfx.h"\r
 #include "GitRev.h"\r
-\r
+#include "Git.h"\r
 \r
 GitRev::GitRev(void)\r
 {\r
        m_Action=0;\r
+       m_IsFull = 0;\r
+       m_IsUpdateing = 0;\r
 }\r
 \r
 GitRev::~GitRev(void)\r
@@ -20,27 +22,72 @@ GitRev& GitRev::operator=(GitRev &rev)
        return *this;\r
 }\r
 #endif\r
-int GitRev::ParserFromLog(CString &log)\r
+void GitRev::Clear()\r
+{\r
+       this->m_Action=0;\r
+       this->m_Files.Clear();\r
+       this->m_Action=0;\r
+       this->m_ParentHash.clear();\r
+       m_CommitterName.Empty();\r
+       m_CommitterEmail.Empty();\r
+       m_Body.Empty();\r
+       m_Subject.Empty();\r
+       m_CommitHash.Empty();\r
+       m_Mark=0;\r
+\r
+}\r
+int GitRev::CopyFrom(GitRev &rev)\r
 {\r
-       int pos=0;\r
+       m_AuthorName    =rev.m_AuthorName       ;\r
+       m_AuthorEmail   =rev.m_AuthorEmail      ;\r
+       m_AuthorDate    =rev.m_AuthorDate       ;\r
+       m_CommitterName =rev.m_CommitterName    ;\r
+       m_CommitterEmail=rev.m_CommitterEmail;\r
+       m_CommitterDate =rev.m_CommitterDate    ;\r
+       m_Subject               =rev.m_Subject          ;\r
+       m_Body                  =rev.m_Body                     ;\r
+       m_CommitHash    =rev.m_CommitHash       ;\r
+       m_ParentHash    =rev.m_ParentHash       ;\r
+       m_Files                 =rev.m_Files                    ;       \r
+       m_Action                =rev.m_Action           ;\r
+       m_Mark                  =rev.m_Mark;\r
+       return 0;\r
+}\r
+int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)\r
+{\r
+       int pos=start;\r
        CString one;\r
        CString key;\r
        CString text;\r
-       CString filelist;\r
-       TCHAR mode;\r
+       BYTE_VECTOR filelist;\r
+       BYTE mode=0;\r
        CTGitPath  path;\r
        this->m_Files.Clear();\r
     m_Action=0;\r
+       int begintime=0;\r
+       BYTE *p=&log[0];\r
+       int filebegin=-1;\r
 \r
-       while( pos>=0 )\r
+       while( pos < log.size() && pos>=0)\r
        {\r
-               one=log.Tokenize(_T("\n"),pos);\r
-               if(one[0]==_T('#') && one[1] == _T('<') && one[3] == _T('>'))\r
+               \r
+               //one=log.Tokenize(_T("\n"),pos);\r
+               if(log[pos]==_T('#') && log[pos+1] == _T('<') && log[pos+3] == _T('>'))\r
                {\r
-                       text = one.Right(one.GetLength()-4);\r
-                       mode = one[2];\r
+                       //text = one.Right(one.GetLength()-4);\r
+                       text.Empty();\r
+                       g_Git.StringAppend(&text,&log[pos+4],CP_UTF8);\r
+                       mode = log[pos+2];\r
+                       \r
                        switch(mode)\r
                        {\r
+                       case LOG_REV_ITEM_BEGIN:\r
+                               begintime++;\r
+                               if(begintime>1)\r
+                                       break;\r
+                               else\r
+                                       this->Clear();\r
+                               break;\r
                        case LOG_REV_AUTHOR_NAME:\r
                                this->m_AuthorName = text;\r
                                break;\r
@@ -66,10 +113,21 @@ int GitRev::ParserFromLog(CString &log)
                                this->m_Body = text +_T("\n");\r
                                break;\r
                        case LOG_REV_COMMIT_HASH:\r
-                               this->m_CommitHash = text;\r
+                               this->m_CommitHash = text.Right(40);\r
+                               if(text.GetLength()>40)\r
+                               {\r
+                                       this->m_Mark=text[0];\r
+                               }\r
                                break;\r
                        case LOG_REV_COMMIT_PARENT:\r
-                               this->m_ParentHash.insert(this->m_ParentHash.end(),text);\r
+                               while(text.GetLength()>0)\r
+                               {\r
+                                       this->m_ParentHash.insert(this->m_ParentHash.end(),text.Left(40));\r
+                                       if(text.GetLength()>40)\r
+                                               text=text.Right(text.GetLength()-41);\r
+                                       else\r
+                                               break;\r
+                               }\r
                                break;\r
                        case LOG_REV_COMMIT_FILE:\r
                                break;\r
@@ -78,19 +136,34 @@ int GitRev::ParserFromLog(CString &log)
                {\r
                        switch(mode)\r
                        {\r
-                       case LOG_REV_COMMIT_BODY:\r
-                               this->m_Body += one+_T("\n");\r
-                               break;\r
+//                     case LOG_REV_COMMIT_BODY:\r
+//                             this->m_Body += one+_T("\n");\r
+//                             break;\r
                        case LOG_REV_COMMIT_FILE:\r
-                               filelist += one +_T("\n");\r
+                               //filelist += one +_T("\n");\r
+                               //filelist.append(log,pos,log.find(0,pos));\r
+                               if(filebegin<0)\r
+                                       filebegin=pos;\r
                                break;\r
                        }\r
                }\r
+               \r
+               if(begintime>1)\r
+               {\r
+                       break;\r
+               }\r
+\r
+               //find next string start \r
+               pos=log.findNextString(pos);\r
        }\r
        \r
-       this->m_Files.ParserFromLog(filelist);\r
-       this->m_Action=this->m_Files.GetAction();\r
-       return 0;\r
+       if(filebegin>=0)\r
+       {\r
+               filelist.append(log,filebegin,pos);     \r
+               this->m_Files.ParserFromLog(filelist);\r
+               this->m_Action=this->m_Files.GetAction();\r
+       }\r
+       return pos;\r
 }\r
 \r
 CTime GitRev::ConverFromString(CString input)\r
@@ -104,3 +177,28 @@ CTime GitRev::ConverFromString(CString input)
                         _wtoi(input.Mid(20,4)));\r
        return tm;\r
 }\r
+\r
+int GitRev::SafeFetchFullInfo(CGit *git)\r
+{\r
+       if(InterlockedExchange(&m_IsUpdateing,TRUE) == FALSE)\r
+       {\r
+               //GitRev rev;\r
+               BYTE_VECTOR onelog;\r
+               TCHAR oldmark=this->m_Mark;\r
+       \r
+               git->GetLog(onelog,m_CommitHash,NULL,1,CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_DETECT_COPYRENAME);\r
+               CString oldhash=m_CommitHash;\r
+               GIT_REV_LIST oldlist=this->m_ParentHash;\r
+               ParserFromLog(onelog);\r
+               \r
+               //ASSERT(oldhash==m_CommitHash);\r
+               if(oldmark!=0)\r
+                       this->m_Mark=oldmark;  //parser full log will cause old mark overwrited. \r
+                                                              //So we need keep old bound mark.\r
+               this->m_ParentHash=oldlist;\r
+               InterlockedExchange(&m_IsUpdateing,FALSE);\r
+               InterlockedExchange(&m_IsFull,TRUE);\r
+               return 0;\r
+       }\r
+       return -1;\r
+}
\ No newline at end of file