X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=src%2FGit%2FGitRev.cpp;h=6414c109d812da9a5522c46e26ea61bc18f826b1;hb=8d3c0fc0fb02b293ea14f74af47c5d1900f96afa;hp=ba9526f7fa5ee0c1287e622a4257eb68fa700121;hpb=da7209a5ce6eb79767374cb9857e89745073d9d2;p=tortoisegit%2FTortoiseGitJp.git diff --git a/src/Git/GitRev.cpp b/src/Git/GitRev.cpp index ba9526f..6414c10 100644 --- a/src/Git/GitRev.cpp +++ b/src/Git/GitRev.cpp @@ -2,11 +2,26 @@ #include "GitRev.h" #include "Git.h" +// provide an ASSERT macro for when compiled without MFC +#if !defined ASSERT + #ifdef _DEBUG + #define ASSERT(x) {if(!(x)) _asm{int 0x03}} + #else + #define ASSERT(x) + #endif +#endif + + GitRev::GitRev(void) { m_Action=0; m_IsFull = 0; m_IsUpdateing = 0; + // fetch local machine timezone info + if ( GetTimeZoneInformation( &m_TimeZone ) == TIME_ZONE_ID_INVALID ) + { + ASSERT(false); + } } GitRev::~GitRev(void) @@ -36,7 +51,7 @@ void GitRev::Clear() m_Mark=0; } -int GitRev::CopyFrom(GitRev &rev) +int GitRev::CopyFrom(GitRev &rev,bool OmitParentAndMark) { m_AuthorName =rev.m_AuthorName ; m_AuthorEmail =rev.m_AuthorEmail ; @@ -47,10 +62,14 @@ int GitRev::CopyFrom(GitRev &rev) m_Subject =rev.m_Subject ; m_Body =rev.m_Body ; m_CommitHash =rev.m_CommitHash ; - m_ParentHash =rev.m_ParentHash ; m_Files =rev.m_Files ; m_Action =rev.m_Action ; - m_Mark =rev.m_Mark; + + if(!OmitParentAndMark) + { + m_ParentHash =rev.m_ParentHash ; + m_Mark =rev.m_Mark; + } return 0; } int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) @@ -65,10 +84,11 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) this->m_Files.Clear(); m_Action=0; int begintime=0; - while( pos <= log.size() && pos>0) + int filebegin=-1; + + while( pos < log.size() && pos>=0) { - if(begintime>1) - break; + //one=log.Tokenize(_T("\n"),pos); if(log[pos]==_T('#') && log[pos+1] == _T('<') && log[pos+3] == _T('>')) { @@ -76,12 +96,15 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) text.Empty(); g_Git.StringAppend(&text,&log[pos+4],CP_UTF8); mode = log[pos+2]; - + switch(mode) { case LOG_REV_ITEM_BEGIN: - this->Clear(); begintime++; + if(begintime>1) + break; + else + this->Clear(); break; case LOG_REV_AUTHOR_NAME: this->m_AuthorName = text; @@ -136,27 +159,67 @@ int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) // break; case LOG_REV_COMMIT_FILE: //filelist += one +_T("\n"); - filelist.append(log,pos,log.find(0,pos)); + //filelist.append(log,pos,log.find(0,pos)); + if(filebegin<0) + filebegin=pos; break; } } - pos=log.find(0,pos); + + if(begintime>1) + { + break; + } + + //find next string start + pos=log.findNextString(pos); } - this->m_Files.ParserFromLog(filelist); - this->m_Action=this->m_Files.GetAction(); - return 0; + if(filebegin>=0) + { + filelist.append(log,filebegin,pos); + this->m_Files.ParserFromLog(filelist); + this->m_Action=this->m_Files.GetAction(); + } + return pos; } CTime GitRev::ConverFromString(CString input) { + // pick up date from string CTime tm(_wtoi(input.Mid(0,4)), _wtoi(input.Mid(5,2)), _wtoi(input.Mid(8,2)), _wtoi(input.Mid(11,2)), _wtoi(input.Mid(14,2)), _wtoi(input.Mid(17,2)), - _wtoi(input.Mid(20,4))); + 0); + // pick up utc offset + CString sign = input.Mid(20,1); // + or - + int hoursOffset = _wtoi(input.Mid(21,2)); + int minsOffset = _wtoi(input.Mid(23,2)); + if ( sign == "-" ) + { + hoursOffset = -hoursOffset; + minsOffset = -minsOffset; + } + // make a timespan object with this value + CTimeSpan offset( 0, hoursOffset, minsOffset, 0 ); + // we have to subtract this from the time given to get UTC + tm -= offset; + // get local timezone + SYSTEMTIME sysTime; + tm.GetAsSystemTime( sysTime ); + SYSTEMTIME local; + if ( SystemTimeToTzSpecificLocalTime( &m_TimeZone, &sysTime, &local ) ) + { + sysTime = local; + } + else + { + ASSERT(false); + } + tm = CTime( sysTime, 0 ); return tm; }