X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=src%2FGit%2FGitRev.cpp;h=518748471bfd2f4f568f0e599e09e5ada1acbef2;hb=1b5f5c490b3c8de8d20f5b63704a060b2282b123;hp=d5e9edbdb08386706ff7c92e77ae9b1eaedc9d11;hpb=4329a6273f282eb5a5527dabdd294b508e67a64e;p=tortoisegit%2FTortoiseGitJp.git diff --git a/src/Git/GitRev.cpp b/src/Git/GitRev.cpp index d5e9edb..5187484 100644 --- a/src/Git/GitRev.cpp +++ b/src/Git/GitRev.cpp @@ -2,6 +2,16 @@ #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; @@ -36,7 +46,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,35 +57,49 @@ 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(CString &log) +int GitRev::ParserFromLog(BYTE_VECTOR &log,int start) { - int pos=0; + int pos=start; CString one; CString key; CString text; - CString filelist; - TCHAR mode=0; + BYTE_VECTOR filelist; + BYTE mode=0; CTGitPath path; this->m_Files.Clear(); m_Action=0; + int begintime=0; + int filebegin=-1; - while( pos>=0 ) + while( pos < log.size() && pos>=0) { - one=log.Tokenize(_T("\n"),pos); - if(one[0]==_T('#') && one[1] == _T('<') && one[3] == _T('>')) + + //one=log.Tokenize(_T("\n"),pos); + if(log[pos]==_T('#') && log[pos+1] == _T('<') && log[pos+3] == _T('>')) { - text = one.Right(one.GetLength()-4); - mode = one[2]; + //text = one.Right(one.GetLength()-4); + 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; @@ -125,30 +149,80 @@ int GitRev::ParserFromLog(CString &log) { switch(mode) { - case LOG_REV_COMMIT_BODY: - this->m_Body += one+_T("\n"); - break; +// case LOG_REV_COMMIT_BODY: +// this->m_Body += one+_T("\n"); +// break; case LOG_REV_COMMIT_FILE: - filelist += one +_T("\n"); + //filelist += one +_T("\n"); + //filelist.append(log,pos,log.find(0,pos)); + if(filebegin<0) + filebegin=pos; break; } } + + 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 ); + TIME_ZONE_INFORMATION timeZone; + if ( GetTimeZoneInformation( &timeZone ) == TIME_ZONE_ID_INVALID ) + { + ASSERT(false); + } + else + { + SYSTEMTIME local; + if ( SystemTimeToTzSpecificLocalTime( &timeZone, &sysTime, &local ) ) + { + sysTime = local; + } + else + { + ASSERT(false); + } + } + tm = CTime( sysTime, 0 ); return tm; } @@ -157,7 +231,7 @@ int GitRev::SafeFetchFullInfo(CGit *git) if(InterlockedExchange(&m_IsUpdateing,TRUE) == FALSE) { //GitRev rev; - CString onelog; + BYTE_VECTOR onelog; TCHAR oldmark=this->m_Mark; git->GetLog(onelog,m_CommitHash,NULL,1,CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_DETECT_COPYRENAME);