OSDN Git Service

Add support i18n.logOutputEncoding at log list
[tortoisegit/TortoiseGitJp.git] / src / Git / GitRev.cpp
index 9ae6b61..59a9d79 100644 (file)
@@ -2,11 +2,25 @@
 #include "GitRev.h"\r
 #include "Git.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
+// provide an ASSERT macro for when compiled without MFC\r
+#if !defined ASSERT\r
+       // Don't use _asm here, it isn't supported by x64 version of compiler. In fact, MFC's ASSERT() is the same with _ASSERTE().\r
+       #define ASSERT(x) _ASSERTE(x)\r
+#endif\r
+\r
+\r
 GitRev::GitRev(void)\r
 {\r
        m_Action=0;\r
        m_IsFull = 0;\r
        m_IsUpdateing = 0;\r
+       // fetch local machine timezone info\r
+       if ( GetTimeZoneInformation( &m_TimeZone ) == TIME_ZONE_ID_INVALID )\r
+       {\r
+               ASSERT(false);\r
+       }\r
 }\r
 \r
 GitRev::~GitRev(void)\r
@@ -69,7 +83,6 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
        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 < log.size() && pos>=0)\r
@@ -80,7 +93,7 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
                {\r
                        //text = one.Right(one.GetLength()-4);\r
                        text.Empty();\r
-                       g_Git.StringAppend(&text,&log[pos+4],CP_UTF8);\r
+                       g_Git.StringAppend(&text,&log[pos+4],CGit::m_LogEncode);\r
                        mode = log[pos+2];\r
                        \r
                        switch(mode)\r
@@ -132,6 +145,10 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
                                        else\r
                                                break;\r
                                }\r
+                               if(m_ParentHash.size()>1)\r
+                               {\r
+                                       int a=1;\r
+                               }\r
                                break;\r
                        case LOG_REV_COMMIT_FILE:\r
                                break;\r
@@ -163,6 +180,7 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
        \r
        if(filebegin>=0)\r
        {\r
+               \r
                filelist.append(log,filebegin,pos);     \r
                this->m_Files.ParserFromLog(filelist);\r
                this->m_Action=this->m_Files.GetAction();\r
@@ -172,14 +190,59 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start)
 \r
 CTime GitRev::ConverFromString(CString input)\r
 {\r
-       CTime tm(_wtoi(input.Mid(0,4)),\r
-                        _wtoi(input.Mid(5,2)),\r
-                        _wtoi(input.Mid(8,2)),\r
-                        _wtoi(input.Mid(11,2)),\r
-                        _wtoi(input.Mid(14,2)),\r
-                        _wtoi(input.Mid(17,2)),\r
-                        _wtoi(input.Mid(20,4)));\r
-       return tm;\r
+       // pick up date from string\r
+       try\r
+       {\r
+               CTime tm(_wtoi(input.Mid(0,4)),\r
+                                _wtoi(input.Mid(5,2)),\r
+                                _wtoi(input.Mid(8,2)),\r
+                                _wtoi(input.Mid(11,2)),\r
+                                _wtoi(input.Mid(14,2)),\r
+                                _wtoi(input.Mid(17,2)),\r
+                                0);\r
+               if(tm.GetTime()<=1)\r
+                       return CTime();//Error parsing time-string\r
+\r
+               // pick up utc offset\r
+               CString sign = input.Mid(20,1);         // + or -\r
+               int hoursOffset =  _wtoi(input.Mid(21,2));\r
+               int minsOffset = _wtoi(input.Mid(23,2));\r
+               if ( sign == "-" )\r
+               {\r
+                       hoursOffset = -hoursOffset;\r
+                       minsOffset = -minsOffset;\r
+               }\r
+               // make a timespan object with this value\r
+               CTimeSpan offset( 0, hoursOffset, minsOffset, 0 );\r
+               // we have to subtract this from the time given to get UTC\r
+               tm -= offset;\r
+               // get local timezone\r
+               SYSTEMTIME sysTime;\r
+               tm.GetAsSystemTime( sysTime );\r
+               SYSTEMTIME local;\r
+               if ( SystemTimeToTzSpecificLocalTime( &m_TimeZone, &sysTime, &local ) )\r
+               {\r
+                       sysTime = local;\r
+               }\r
+               else\r
+               {\r
+                       ASSERT(false);\r
+               }\r
+               tm = CTime( sysTime, 0 );\r
+               return tm;\r
+       }\r
+       catch(CException* e)\r
+       {\r
+               //Probably the date was something like 1970-01-01 00:00:00. _mktime64() doesnt like this.\r
+               //Dont let the application crash on this exception\r
+\r
+#ifdef _AFX //CException classes are only defined when afx.h is included.\r
+                       //When afx.h is not included, the exception is leaked.\r
+                       //This will probably never happen because when CException is not defined, it cannot be thrown.\r
+               e->Delete();\r
+#endif //ifdef _AFX\r
+       }\r
+       return CTime(); //Return an invalid time\r
 }\r
 \r
 int GitRev::SafeFetchFullInfo(CGit *git)\r
@@ -190,7 +253,7 @@ int GitRev::SafeFetchFullInfo(CGit *git)
                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
+               git->GetLog(onelog,m_CommitHash,NULL,1,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