#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
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
{\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
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
\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
\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
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