<Tool\r
Name="VCCLCompilerTool"\r
Optimization="0"\r
- AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+ AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"\r
MinimalRebuild="true"\r
BasicRuntimeChecks="3"\r
<Tool\r
Name="VCCLCompilerTool"\r
Optimization="0"\r
- AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+ AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
PreprocessorDefinitions="WIN64;_DEBUG;_LIB"\r
MinimalRebuild="true"\r
BasicRuntimeChecks="3"\r
/>\r
<Tool\r
Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+ AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"\r
RuntimeLibrary="2"\r
EnableFunctionLevelLinking="true"\r
/>\r
<Tool\r
Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories="../TortoiseShell;../utils"\r
+ AdditionalIncludeDirectories="../TortoiseShell;../utils;../../ext/gitdll"\r
PreprocessorDefinitions="WIN64;NDEBUG;_LIB"\r
RuntimeLibrary="2"\r
EnableFunctionLevelLinking="true"\r
--- /dev/null
+#pragma once\r
+#if defined(_MFC_VER)\r
+#include "afx.h"\r
+#endif\r
+#define GIT_HASH_SIZE 20\r
+\r
+class CGitHash\r
+{\r
+ unsigned char m_hash[GIT_HASH_SIZE];\r
+public:\r
+ CGitHash()\r
+ {\r
+ memset(m_hash,0, GIT_HASH_SIZE);\r
+ }\r
+ CGitHash(char *p)\r
+ {\r
+ memcpy(m_hash,p,GIT_HASH_SIZE);\r
+ } \r
+ CGitHash(CString &str)\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ {\r
+ unsigned char a;\r
+ a=0;\r
+ for(int j=2*i;j<2*i+1;j++)\r
+ {\r
+ TCHAR ch = str[j];\r
+ if(ch >= _T('0') && ch <= _T('9'))\r
+ a |= (ch - _T('0'))&0xF;\r
+ else if(ch >=_T('A') && ch <= _T('F'))\r
+ a |= (ch - _T('A'))&0xF;\r
+ else if(ch >=_T('a') && ch <= _T('f'))\r
+ a |= (ch - _T('a'))&0xF;\r
+ \r
+ a =a<<4;\r
+ }\r
+ m_hash[i]=a;\r
+ }\r
+ }\r
+ void Empty()\r
+ {\r
+ memset(m_hash,0, GIT_HASH_SIZE);\r
+ }\r
+ bool IsEmpty()\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ {\r
+ if(m_hash[i] != 0)\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ \r
+ CString ToString()\r
+ {\r
+ CString str;\r
+ CString a;\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ {\r
+ a.Format(_T("%02X"),m_hash[i]);\r
+ str+=a;\r
+ }\r
+ return str;\r
+ }\r
+ operator CString ()\r
+ { \r
+ return ToString(); \r
+ } \r
+\r
+ bool operator == (CGitHash &hash)\r
+ {\r
+ return memcmp(m_hash,hash.m_hash,GIT_HASH_SIZE) == 0;\r
+ }\r
+ \r
+ \r
+ friend bool operator<(const CGitHash& left, const CGitHash& right)\r
+ {\r
+ return memcmp(left.m_hash,right.m_hash,GIT_HASH_SIZE) < 0;\r
+ }\r
+\r
+ friend bool operator>(const CGitHash& left, const CGitHash& right)\r
+ {\r
+ return memcmp(left.m_hash, right.m_hash, GIT_HASH_SIZE) > 0;\r
+ }\r
+\r
+#if defined(_MFC_VER)\r
+ friend CArchive& AFXAPI operator<<(CArchive& ar, CGitHash& hash)\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ ar<<hash.m_hash[i];\r
+ return ar;\r
+ }\r
+ friend CArchive& AFXAPI operator>>(CArchive& ar, CGitHash& hash)\r
+ {\r
+ for(int i=0;i<GIT_HASH_SIZE;i++)\r
+ ar>>hash.m_hash[i];\r
+ return ar;\r
+ }\r
+#endif\r
+};\r
+\r
#include "ATLComTime.h"\r
#include "GitRev.h"\r
#include "Git.h"\r
+#include "GitDLL.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
//GitRev rev;\r
BYTE_VECTOR onelog;\r
TCHAR oldmark=this->m_Mark;\r
- \r
- git->GetLog(onelog,m_CommitHash,NULL,1,CGit::LOG_INFO_FULL_DIFF|CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_DETECT_COPYRENAME|CGit::LOG_INFO_SHOW_MERGEDFILE);\r
+ CString commithash = m_CommitHash;\r
+ git->GetLog(onelog,commithash,NULL,1,CGit::LOG_INFO_FULL_DIFF|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
#include "gittype.h"\r
#include "GitStatus.h"\r
#include "AtlTime.h"\r
+#include "GitHash.h"\r
\r
-typedef std::vector<git_revnum_t> GIT_REV_LIST;\r
+typedef std::vector<CGitHash> GIT_REV_LIST;\r
\r
#define LOG_REV_AUTHOR_NAME _T('0')\r
#define LOG_REV_AUTHOR_EMAIL _T('1')\r
CTime m_CommitterDate;\r
CString m_Subject;\r
CString m_Body;\r
- git_revnum_t m_CommitHash;\r
+ CGitHash m_CommitHash;\r
GIT_REV_LIST m_ParentHash;\r
CTGitPathList m_Files;\r
int m_Action;\r
Microsoft Visual Studio Solution File, Format Version 10.00\r
# Visual Studio 2008\r
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Git", "Git\Git.vcproj", "{7CA5B1EB-8CC9-40A6-96D8-83649C1A870B}"\r
+ ProjectSection(ProjectDependencies) = postProject\r
+ {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} = {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F}\r
+ EndProjectSection\r
EndProject\r
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TortoiseProc", "TortoiseProc\TortoiseProc.vcproj", "{50797F06-39C5-4802-8E2B-7B7A4EF03214}"\r
ProjectSection(ProjectDependencies) = postProject\r
}\r
int CLogCache::AddCacheEntry(GitRev &Rev)\r
{\r
- this->m_NewCacheEntry.push_back(Rev);\r
+ this->m_HashMap[Rev.m_CommitHash] = Rev;\r
return 0;\r
}\r
\r
{\r
if(this->m_HashMapIndex.find(Rev.m_CommitHash)==m_HashMapIndex.end())\r
{\r
- for(int i=0;i<this->m_NewCacheEntry.size();i++)\r
+ if(this->m_HashMap.IsExist(Rev.m_CommitHash))\r
{\r
- if(m_NewCacheEntry[i].m_CommitHash==Rev.m_CommitHash)\r
- {\r
- Rev.CopyFrom(m_NewCacheEntry[i],true);\r
- return 0;\r
- }\r
+ Rev.CopyFrom(m_HashMap[Rev.m_CommitHash]);\r
+ return 0;\r
}\r
return -1;\r
}\r
if( count != sizeof(SLogCacheItem) )\r
break;\r
\r
- CString str;\r
- g_Git.StringAppend(&str,Item.m_Hash,CP_UTF8,40);\r
- this->m_HashMapIndex[str]=Item.m_Offset;\r
+ this->m_HashMapIndex[Item.m_Hash]=Item.m_Offset;\r
}\r
\r
return 0;\r
}\r
int CLogCache::SaveCache()\r
{\r
- if( this->m_NewCacheEntry.size() == 0 )\r
+ if( this->m_HashMap.size() == 0 )\r
return 0;\r
\r
bool bIsRebuild=false;\r
\r
m_DataFile.SeekToEnd();\r
m_IndexFile.SeekToEnd();\r
- for(int i=0;i<this->m_NewCacheEntry.size();i++)\r
+ CGitHashMap::iterator i;\r
+ for(i=m_HashMap.begin();i!=m_HashMap.end();i++)\r
{\r
- if(this->m_HashMapIndex.find(m_NewCacheEntry[i].m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
+ if(this->m_HashMapIndex.find((*i).second.m_CommitHash) == m_HashMapIndex.end() || bIsRebuild)\r
{\r
- ULONGLONG offset = m_DataFile.GetPosition();\r
- this->SaveOneItem(m_NewCacheEntry[i],offset);\r
+ if((*i).second.m_IsFull)\r
+ {\r
+ ULONGLONG offset = m_DataFile.GetPosition();\r
+ this->SaveOneItem((*i).second,offset);\r
\r
- SLogCacheItem item;\r
- for(int j=0; j<40;j++)\r
- item.m_Hash[j]=(BYTE)m_NewCacheEntry[i].m_CommitHash[j];\r
- item.m_Offset=offset;\r
+ SLogCacheItem item;\r
+ item.m_Hash = (*i).second.m_CommitHash;\r
+ item.m_Offset=offset;\r
\r
- m_IndexFile.Write(&item,sizeof(SLogCacheItem));\r
+ m_IndexFile.Write(&item,sizeof(SLogCacheItem));\r
+ }\r
}\r
}\r
m_IndexFile.Close();\r
\r
int CGitLogList::CherryPickFrom(CString from, CString to)\r
{\r
- CLogDataVector logs;\r
+ CLogDataVector logs(&m_LogCache);\r
if(logs.ParserFromLog(NULL,-1,0,&from,&to))\r
return -1;\r
\r
{\r
if (progress.IsValid())\r
{\r
- progress.FormatPathLine(1, _T("Pick up %s"), logs[i].m_CommitHash);\r
- progress.FormatPathLine(2, _T("%s"), logs[i].m_Subject);\r
+ progress.FormatPathLine(1, _T("Pick up %s"), logs.GetGitRevAt(i).m_CommitHash);\r
+ progress.FormatPathLine(2, _T("%s"), logs.GetGitRevAt(i).m_Subject);\r
progress.SetProgress(logs.size()-i, logs.size());\r
}\r
if ((progress.IsValid())&&(progress.HasUserCancelled()))\r
return -1;\r
}\r
CString cmd,out;\r
- cmd.Format(_T("git.exe cherry-pick %s"),logs[i].m_CommitHash);\r
+ cmd.Format(_T("git.exe cherry-pick %s"),logs.GetGitRevAt(i).m_CommitHash);\r
out.Empty();\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r
CString tempfile=GetTempFile();\r
CString cmd;\r
GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
- if(r1->m_CommitHash != GIT_REV_ZERO)\r
+ if(!r1->m_CommitHash.IsEmpty())\r
{\r
cmd.Format(_T("git.exe diff-tree -r -p --stat %s"),r1->m_CommitHash);\r
}else\r
cmd.Format(_T("git.exe diff -r -p --stat"));\r
\r
g_Git.RunLogFile(cmd,tempfile);\r
- CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r1->m_Subject);\r
+ CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.ToString().Left(6)+_T(":")+r1->m_Subject);\r
}\r
break;\r
\r
GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
GitRev * r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
\r
- if( r1->m_CommitHash == GIT_REV_ZERO)\r
+ if( r1->m_CommitHash.IsEmpty())\r
{\r
cmd.Format(_T("git.exe diff -r -p --stat %s"),r2->m_CommitHash);\r
- }else if( r2->m_CommitHash == GIT_REV_ZERO)\r
+ }else if( r2->m_CommitHash.IsEmpty())\r
{\r
cmd.Format(_T("git.exe diff -r -p --stat %s"),r1->m_CommitHash);\r
}else\r
cmd.Format(_T("git.exe diff-tree -r -p --stat %s %s"),r1->m_CommitHash,r2->m_CommitHash);\r
\r
g_Git.RunLogFile(cmd,tempfile);\r
- CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r2->m_CommitHash.Left(6));\r
+ CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.ToString().Left(6)+_T(":")+r2->m_CommitHash.ToString().Left(6));\r
\r
}\r
break;\r
if(pSelLogEntry->m_ParentHash.size()>0)\r
//if(m_logEntries.m_HashMap[pSelLogEntry->m_ParentHash[0]]>=0)\r
{\r
- dlg.SetDiff(NULL,pSelLogEntry->m_CommitHash,pSelLogEntry->m_ParentHash[0]);\r
+ dlg.SetDiff(NULL,pSelLogEntry->m_CommitHash.ToString(),pSelLogEntry->m_ParentHash[0].ToString());\r
dlg.DoModal();\r
}else\r
{\r
}\r
break;\r
case ID_EXPORT:\r
- CAppUtils::Export(&pSelLogEntry->m_CommitHash);\r
+ CAppUtils::Export(&pSelLogEntry->m_CommitHash.ToString());\r
break;\r
case ID_CREATE_BRANCH:\r
- CAppUtils::CreateBranchTag(FALSE,&pSelLogEntry->m_CommitHash);\r
+ CAppUtils::CreateBranchTag(FALSE,&pSelLogEntry->m_CommitHash.ToString());\r
ReloadHashMap();\r
Invalidate(); \r
break;\r
case ID_CREATE_TAG:\r
- CAppUtils::CreateBranchTag(TRUE,&pSelLogEntry->m_CommitHash);\r
+ CAppUtils::CreateBranchTag(TRUE,&pSelLogEntry->m_CommitHash.ToString());\r
ReloadHashMap();\r
Invalidate();\r
break;\r
case ID_SWITCHTOREV:\r
- CAppUtils::Switch(&pSelLogEntry->m_CommitHash);\r
+ CAppUtils::Switch(&pSelLogEntry->m_CommitHash.ToString());\r
ReloadHashMap();\r
Invalidate();\r
break;\r
case ID_RESET:\r
- CAppUtils::GitReset(&pSelLogEntry->m_CommitHash);\r
+ CAppUtils::GitReset(&pSelLogEntry->m_CommitHash.ToString());\r
ReloadHashMap();\r
Invalidate();\r
break;\r
while(pos)\r
{\r
int indexNext = GetNextSelectedItem(pos);\r
- dlg.m_CommitList.m_logEntries.push_back(*(GitRev*)m_arShownList[indexNext]);\r
- dlg.m_CommitList.m_logEntries.at(dlg.m_CommitList.m_logEntries.size()-1).m_Action |= CTGitPath::LOGACTIONS_REBASE_PICK;\r
+ dlg.m_CommitList.m_logEntries.push_back( ((GitRev*)m_arShownList[indexNext])->m_CommitHash );\r
+ dlg.m_CommitList.m_logEntries.GetGitRevAt(dlg.m_CommitList.m_logEntries.size()-1).m_Action |= CTGitPath::LOGACTIONS_REBASE_PICK;\r
}\r
\r
if(dlg.DoModal() == IDOK)\r
GitRev * r2 = NULL;\r
if(select == 1)\r
{\r
- cmd += _T(" /startrev:")+r1->m_CommitHash;\r
+ cmd += _T(" /startrev:")+r1->m_CommitHash.ToString();\r
}\r
else \r
{\r
r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
if( this->m_IsOldFirst )\r
{ \r
- cmd += _T(" /startrev:")+r1->m_CommitHash+_T("~1");\r
- cmd += _T(" /endrev:")+r2->m_CommitHash;\r
+ cmd += _T(" /startrev:")+r1->m_CommitHash.ToString()+_T("~1");\r
+ cmd += _T(" /endrev:")+r2->m_CommitHash.ToString();\r
\r
}else\r
{ \r
- cmd += _T(" /startrev:")+r2->m_CommitHash+_T("~1");\r
- cmd += _T(" /endrev:")+r1->m_CommitHash; \r
+ cmd += _T(" /startrev:")+r2->m_CommitHash.ToString()+_T("~1");\r
+ cmd += _T(" /endrev:")+r1->m_CommitHash.ToString(); \r
} \r
\r
}\r
, m_nSelectedFilter(LOGFILTER_ALL)\r
, m_bVista(false)\r
, m_bShowWC(false)\r
+ , m_logEntries(&m_LogCache)\r
{\r
// use the default GUI font, create a copy of it and\r
// change the copy to BOLD (leave the rest of the font\r
\r
m_IsIDReplaceAction=FALSE;\r
\r
- m_wcRev.m_CommitHash=GIT_REV_ZERO;\r
+ m_wcRev.m_CommitHash.Empty();\r
m_wcRev.m_Subject=_T("Working dir changes");\r
m_wcRev.m_ParentHash.clear();\r
m_wcRev.m_Mark=_T('-');\r
\r
\r
if (data->m_Lanes.size() == 0)\r
- m_logEntries.setLane(data->m_CommitHash);\r
+ m_logEntries.setLane(data->m_CommitHash.ToString());\r
\r
std::vector<int>& lanes=data->m_Lanes;\r
UINT laneNum = lanes.size();\r
// if ((data->childStackDepth)||(m_mergedRevs.find(data->Rev) != m_mergedRevs.end()))\r
// crText = GetSysColor(COLOR_GRAYTEXT);\r
// \r
- if (data->m_CommitHash == GIT_REV_ZERO)\r
+ if (data->m_CommitHash.IsEmpty())\r
{\r
//crText = GetSysColor(RGB(200,200,0));\r
//SelectObject(pLVCD->nmcd.hdc, m_boldFont);\r
FillBackGround(pLVCD->nmcd.hdc, (INT_PTR)pLVCD->nmcd.dwItemSpec,rect);\r
\r
GitRev* data = (GitRev*)m_arShownList.GetAt(pLVCD->nmcd.dwItemSpec);\r
- if( data ->m_CommitHash != GIT_REV_ZERO)\r
+ if( !data ->m_CommitHash.IsEmpty())\r
DrawGraph(pLVCD->nmcd.hdc,rect,pLVCD->nmcd.dwItemSpec);\r
\r
*pResult = CDRF_SKIPDEFAULT;\r
lstrcpyn(pItem->pszText, (LPCTSTR)pLogEntry->m_AuthorName, pItem->cchTextMax);\r
break;\r
case this->LOGLIST_DATE: //Date\r
- if (pLogEntry && pLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if (!pLogEntry && pLogEntry->m_CommitHash.IsEmpty())\r
lstrcpyn(pItem->pszText,\r
CAppUtils::FormatDateAndTime( pLogEntry->m_AuthorDate, m_DateFormat, true, m_bRelativeTimes ), \r
pItem->cchTextMax);\r
{\r
\r
{\r
- if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if( !pSelLogEntry->m_CommitHash.IsEmpty())\r
{\r
if(m_ContextMenuMask&GetContextMenuBit(ID_COMPARE))\r
popup.AppendMenuIcon(ID_COMPARE, IDS_LOG_POPUP_COMPARE, IDI_DIFF);\r
format.LoadString(IDS_RESET_TO_THIS_FORMAT);\r
str.Format(format,g_Git.GetCurrentBranch());\r
\r
- if(pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if(!pSelLogEntry->m_CommitHash.IsEmpty())\r
{\r
if(m_ContextMenuMask&GetContextMenuBit(ID_RESET))\r
popup.AppendMenuIcon(ID_RESET,str,IDI_REVERT);\r
popup.AppendMenu(MF_SEPARATOR, NULL);\r
}\r
\r
- if ( GetSelectedCount() >0 && pSelLogEntry->m_CommitHash != GIT_REV_ZERO)\r
+ if ( GetSelectedCount() >0 && (!pSelLogEntry->m_CommitHash.IsEmpty()))\r
{\r
if ( IsSelectionContinuous() && GetSelectedCount() >= 2 )\r
{\r
{\r
if(m_IsOldFirst)\r
{\r
- m_logEntries[m_logEntries.size()-i-1].m_IsFull=TRUE;\r
+ m_logEntries.GetGitRevAt(m_logEntries.size()-i-1).m_IsFull=TRUE;\r
this->m_arShownList.Add(&m_logEntries[m_logEntries.size()-i-1]);\r
\r
}else\r
{\r
- m_logEntries[i].m_IsFull=TRUE;\r
+ m_logEntries.GetGitRevAt(i).m_IsFull=TRUE;\r
this->m_arShownList.Add(&m_logEntries[i]);\r
}\r
}\r
mask |= m_ShowMask;\r
\r
if(m_bShowWC)\r
- this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev);\r
+ this->m_logEntries.insert(m_logEntries.begin(),this->m_wcRev.m_CommitHash);\r
\r
this->m_logEntries.FetchShortLog(path,m_StartRef,-1,mask,m_bShowWC?1:0);\r
\r
\r
for(unsigned int i=0;i<m_logEntries.size();i++)\r
{\r
- if(i>0 || m_logEntries[i].m_CommitHash != GIT_REV_ZERO)\r
- m_logEntries[i].m_Subject=_T("parser...");\r
+ if(i>0 || !m_logEntries.GetGitRevAt(i).m_CommitHash.IsEmpty())\r
+ m_logEntries.GetGitRevAt(i).m_Subject=_T("parser...");\r
\r
if(this->m_IsOldFirst)\r
{\r
latest=CTime(1971,1,2,0,0,0);\r
for(unsigned int i=0;i<m_logEntries.size();i++)\r
{\r
- if(m_logEntries[i].m_AuthorDate.GetTime() < oldest.GetTime())\r
- oldest = m_logEntries[i].m_AuthorDate.GetTime();\r
+ if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() < oldest.GetTime())\r
+ oldest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
\r
- if(m_logEntries[i].m_AuthorDate.GetTime() > latest.GetTime())\r
- latest = m_logEntries[i].m_AuthorDate.GetTime();\r
+ if(m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime() > latest.GetTime())\r
+ latest = m_logEntries.GetGitRevAt(i).m_AuthorDate.GetTime();\r
\r
}\r
}\r
}\r
//Set updating\r
int rev=itRev->second;\r
- GitRev* revInVector=&m_ploglist->m_logEntries[rev];\r
+ GitRev* revInVector=&m_ploglist->m_logEntries.GetGitRevAt(rev);\r
\r
\r
if(revInVector->m_IsFull)\r
return;\r
\r
- if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries[rev]))\r
+ if(!m_ploglist->m_LogCache.GetCacheData(m_ploglist->m_logEntries.GetGitRevAt(rev)))\r
{\r
++m_CollectedCount;\r
- InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_ploglist->m_logEntries[rev].m_IsFull,TRUE);\r
+ InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&m_ploglist->m_logEntries.GetGitRevAt(rev).m_IsFull,TRUE);\r
::PostMessage(m_ploglist->m_hWnd,MSG_LOADED,(WPARAM)rev,0);\r
return;\r
}\r
{\r
for(unsigned int i=0;i<m_logEntries.size();i++)\r
{\r
- if(m_logEntries[i].m_IsFull)\r
+ if(m_logEntries.GetGitRevAt(i).m_IsFull)\r
continue;\r
\r
- if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+ if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
{\r
if(!m_logEntries.FetchFullInfo(i))\r
{\r
updated++;\r
}\r
- m_LogCache.AddCacheEntry(m_logEntries[i]);\r
+ m_LogCache.AddCacheEntry(m_logEntries.GetGitRevAt(i));\r
\r
}else\r
{\r
updated++;\r
- InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsFull,TRUE);\r
}\r
\r
::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)i,0);\r
int update=0;\r
for(int i=0;i<m_logEntries.size();i++)\r
{\r
- if( i==0 && m_logEntries[i].m_CommitHash == GIT_REV_ZERO)\r
+ if( i==0 && m_logEntries.GetGitRevAt(i).m_CommitHash.IsEmpty() )\r
{\r
- m_logEntries[i].m_Files.Clear();\r
- m_logEntries[i].m_ParentHash.clear();\r
- m_logEntries[i].m_ParentHash.push_back(m_HeadHash);\r
- g_Git.GetCommitDiffList(m_logEntries[i].m_CommitHash,this->m_HeadHash,m_logEntries[i].m_Files);\r
- m_logEntries[i].m_Action =0;\r
- for(int j=0;j< m_logEntries[i].m_Files.GetCount();j++)\r
- m_logEntries[i].m_Action |= m_logEntries[i].m_Files[j].m_Action;\r
+ m_logEntries.GetGitRevAt(i).m_Files.Clear();\r
+ m_logEntries.GetGitRevAt(i).m_ParentHash.clear();\r
+ m_logEntries.GetGitRevAt(i).m_ParentHash.push_back(m_HeadHash);\r
+ g_Git.GetCommitDiffList(m_logEntries.GetGitRevAt(i).m_CommitHash,this->m_HeadHash,m_logEntries.GetGitRevAt(i).m_Files);\r
+ m_logEntries.GetGitRevAt(i).m_Action =0;\r
+ for(int j=0;j< m_logEntries.GetGitRevAt(i).m_Files.GetCount();j++)\r
+ m_logEntries.GetGitRevAt(i).m_Action |= m_logEntries.GetGitRevAt(i).m_Files[j].m_Action;\r
\r
- m_logEntries[i].m_Body.Format(_T("%d files changed"),m_logEntries[i].m_Files.GetCount());\r
+ m_logEntries.GetGitRevAt(i).m_Body.Format(_T("%d files changed"),m_logEntries.GetGitRevAt(i).m_Files.GetCount());\r
::PostMessage(m_hWnd,MSG_LOADED,(WPARAM)0,0);\r
continue;\r
}\r
\r
- start=this->m_logEntries[i].ParserFromLog(m_logEntries.m_RawlogData,start);\r
+ start=this->m_logEntries.GetGitRevAt(i).ParserFromLog(m_logEntries.m_RawlogData,start);\r
m_logEntries.m_HashMap[m_logEntries[i].m_CommitHash]=i;\r
\r
- if(m_LogCache.GetCacheData(m_logEntries[i]))\r
+ if(m_LogCache.GetCacheData(m_logEntries.GetGitRevAt(i)))\r
{\r
if(firstcommit.IsEmpty())\r
firstcommit=m_logEntries[i].m_CommitHash;\r
\r
}else\r
{\r
- InterlockedExchange(&m_logEntries[i].m_IsUpdateing,FALSE);\r
- InterlockedExchange(&m_logEntries[i].m_IsFull,TRUE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsUpdateing,FALSE);\r
+ InterlockedExchange(&m_logEntries.GetGitRevAt(i).m_IsFull,TRUE);\r
update++;\r
}\r
::PostMessage(m_hWnd,MSG_LOADED,(WPARAM) i, 0);\r
//#include "RepositoryInfo.h"\r
//#include "EditPropertiesDlg.h"\r
#include "FileDiffDlg.h"\r
+#include "GitHash.h"\r
+CGitHashMap a;\r
\r
void CLogDataVector::ClearAll()\r
{\r
#include "ILogReceiver.h"\r
#include "lanes.h"\r
#include <set> \r
-\r
+#include "GitHash.h"\r
+#include "GitLogCache.h"\r
class CLogDlg;\r
\r
/**\r
* Helper class for the log dialog, handles all the log entries, including\r
* sorting.\r
*/\r
-class CLogDataVector : public std::vector<GitRev>\r
+class CLogDataVector : public std::vector<CGitHash>\r
{\r
public:\r
+ CLogCache *m_pLogCache;\r
/// De-allocates log items.\r
- CLogDataVector()\r
+ CLogDataVector(CLogCache *pLogCache)\r
{\r
+ m_pLogCache=pLogCache;\r
m_FirstFreeLane=0;\r
}\r
+ GitRev & GetGitRevAt(int i)\r
+ {\r
+ ASSERT(i<size());\r
+ return m_pLogCache->m_HashMap[(*this)[i]];\r
+ }\r
void ClearAll();\r
int ParserFromLog(CTGitPath *path =NULL,int count = -1,int infomask=CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE|CGit::LOG_INFO_SHOW_MERGEDFILE,\r
CString *from=NULL,CString *to=NULL);\r
>\r
</File>\r
<File\r
- RelativePath=".\copy.ico"\r
+ RelativePath="..\Resources\copy.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\copy.ico"\r
+ RelativePath=".\copy.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\explorer.ico"\r
+ RelativePath=".\explorer.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\explorer.ico"\r
+ RelativePath="..\Resources\explorer.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath=".\newfolder.ico"\r
+ RelativePath="..\Resources\newfolder.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\newfolder.ico"\r
+ RelativePath=".\newfolder.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath=".\refresh.ico"\r
+ RelativePath="..\Resources\refresh.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\refresh.ico"\r
+ RelativePath=".\refresh.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\save.ico"\r
+ RelativePath=".\save.ico"\r
>\r
</File>\r
<File\r
- RelativePath=".\save.ico"\r
+ RelativePath="..\Resources\save.ico"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath=".\up.ico"\r
+ RelativePath="..\Resources\up.ico"\r
>\r
</File>\r
<File\r
- RelativePath="..\Resources\up.ico"\r
+ RelativePath=".\up.ico"\r
>\r
</File>\r
<File\r
#include "Git.h"\r
#include "TGitPath.h"\r
#include "GitRev.h"\r
+#include "GitHash.h"\r
\r
#define LOG_INDEX_MAGIC 0x88445566\r
#define LOG_DATA_MAGIC 0x99aa00FF\r
#define LOG_DATA_ITEM_MAGIC 0x0F8899CC\r
#define LOG_DATA_FILE_MAGIC 0x19999FFF\r
-#define LOG_INDEX_VERSION 0x6 \r
+#define LOG_INDEX_VERSION 0x7\r
\r
struct SLogCacheIndexHeader \r
{\r
\r
struct SLogCacheItem\r
{\r
- BYTE m_Hash[40];\r
+ CGitHash m_Hash;\r
ULONGLONG m_Offset;\r
};\r
\r
DWORD m_FileCount;\r
};\r
\r
+class CGitHashMap:public std::map<CGitHash,GitRev>\r
+{\r
+public:\r
+ bool IsExist(CGitHash &hash)\r
+ {\r
+ return find(hash) != end();\r
+ }\r
+};\r
+\r
#define INDEX_FILE_NAME _T("tortoisegit.index")\r
#define DATA_FILE_NAME _T("tortoisegit.data")\r
#define LOCK_FILE_NAME _T("tortoisegit.lock")\r
CLogCache();\r
~CLogCache();\r
int FetchCacheIndex(CString GitDir);\r
- std::vector<GitRev> m_NewCacheEntry;\r
- std::map<CString, ULONGLONG> m_HashMapIndex;\r
+\r
+ CGitHashMap m_HashMap;\r
+ std::map<CGitHash, ULONGLONG> m_HashMapIndex;\r
+\r
int GetCacheData(GitRev &Rev);\r
int AddCacheEntry(GitRev &Rev);\r
int SaveCache();\r
SetDlgItemText(m_hwnd,IDC_SHELL_CURRENT_BRANCH,branch);\r
SetDlgItemText(m_hwnd,IDC_SHELL_REMOTE_BRANCH,remotebranch);\r
\r
- SetDlgItemText(m_hwnd,IDC_HEAD_HASH,rev.m_CommitHash);\r
+ SetDlgItemText(m_hwnd,IDC_HEAD_HASH,rev.m_CommitHash.ToString());\r
SetDlgItemText(m_hwnd,IDC_HEAD_SUBJECT,rev.m_Subject);\r
SetDlgItemText(m_hwnd,IDC_HEAD_AUTHOR,rev.m_AuthorName);\r
SetDlgItemText(m_hwnd,IDC_HEAD_DATE,rev.m_AuthorDate.Format(_T("%Y-%m-%d %H:%M:%S")));\r
rev.Clear();\r
rev.ParserFromLog(logout);\r
\r
- SetDlgItemText(m_hwnd,IDC_LAST_HASH,rev.m_CommitHash);\r
+ SetDlgItemText(m_hwnd,IDC_LAST_HASH,rev.m_CommitHash.ToString());\r
SetDlgItemText(m_hwnd,IDC_LAST_SUBJECT,rev.m_Subject);\r
SetDlgItemText(m_hwnd,IDC_LAST_AUTHOR,rev.m_AuthorName);\r
SetDlgItemText(m_hwnd,IDC_LAST_DATE,rev.m_AuthorDate.Format(_T("%Y-%m-%d %H:%M:%S")));\r
int i=0;\r
do\r
{\r
- if (!revision.m_CommitHash.IsEmpty())\r
+ if (!((GitRev&)revision).m_CommitHash.IsEmpty())\r
{\r
- possibletempfile.Format(_T("%s%s-rev%s.git%3.3x.tmp%s"), temppath, (LPCTSTR)path.GetFileOrDirectoryName(), (LPCTSTR)revision.m_CommitHash.Left(7), i, (LPCTSTR)path.GetFileExtension());\r
+ possibletempfile.Format(_T("%s%s-rev%s.git%3.3x.tmp%s"), temppath, (LPCTSTR)path.GetFileOrDirectoryName(), (LPCTSTR)((GitRev&)revision).m_CommitHash.ToString().Left(7), i, (LPCTSTR)path.GetFileExtension());\r
}\r
else\r
{\r