#include "Git.h"\r
#include "atlconv.h"\r
#include "GitRev.h"\r
+#include "registry.h"\r
\r
#define MAX_DIRBUFFER 1000\r
CGit g_Git;\r
return 0;\r
}\r
\r
-int CGit::GetLog(CString& logOut, CString &hash, int count)\r
+int CGit::GetLog(CString& logOut, CString &hash, CTGitPath *path ,int count,int mask)\r
{\r
\r
CString cmd;\r
CString log;\r
CString num;\r
CString since;\r
+\r
+ CString file;\r
+\r
+ if(path)\r
+ file.Format(_T(" -- \"%s\""),path->GetGitPathString());\r
+ \r
if(count>0)\r
num.Format(_T("-n%d"),count);\r
\r
- cmd.Format(_T("git.exe log %s -C --numstat --raw --pretty=format:\""),\r
- num);\r
+ CString param;\r
+\r
+ if(mask& LOG_INFO_STAT )\r
+ param += _T(" -numstat ");\r
+ if(mask& LOG_INFO_FILESTATE)\r
+ param += _T("--raw");\r
+\r
+ cmd.Format(_T("git.exe log %s -C %s --pretty=format:\""),\r
+ num,param);\r
+\r
BuildOutputFormat(log);\r
cmd += log;\r
- cmd += CString(_T("\" "))+hash;\r
+ cmd += CString(_T("\" "))+hash+file;\r
+\r
return Run(cmd,&logOut);\r
}\r
\r
}\r
}\r
return ret;\r
+}\r
+\r
+BOOL CGit::CheckMsysGitDir()\r
+{\r
+ CRegString msysdir=CRegString(_T("Software\\TortoiseGit\\MSysGit"),_T(""),FALSE,HKEY_LOCAL_MACHINE);\r
+ CString str=msysdir;\r
+ if(str.IsEmpty())\r
+ {\r
+ CRegString msysinstalldir=CRegString(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1\\InstallLocation"),_T(""),FALSE,HKEY_LOCAL_MACHINE);\r
+ str=msysinstalldir;\r
+ str+="\\bin";\r
+ msysdir=str;\r
+ msysdir.write();\r
+\r
+ }\r
+ //CGit::m_MsysGitPath=str;\r
+\r
+ TCHAR *oldpath,*home;\r
+ size_t size;\r
+\r
+ _tdupenv_s(&home,&size,_T("HOME")); \r
+ \r
+ if(home == NULL)\r
+ { \r
+ _tdupenv_s(&home,&size,_T("USERPROFILE")); \r
+ _tputenv_s(_T("HOME"),home);\r
+ free(home);\r
+ }\r
+ //set path\r
+ _tdupenv_s(&oldpath,&size,_T("PATH")); \r
+\r
+ CString path;\r
+ path.Format(_T("%s;"),str);\r
+ path+=oldpath;\r
+\r
+ _tputenv_s(_T("PATH"),path);\r
+\r
+ free(oldpath);\r
+\r
+ CString cmd,out;\r
+ cmd=_T("git.exe --version");\r
+ if(g_Git.Run(cmd,&out))\r
+ {\r
+ return false;\r
+ }\r
+ else\r
+ return true;\r
+\r
}
\ No newline at end of file
private:\r
GitAdminDir m_GitDir;\r
public:\r
- static CString m_MsysGitPath;\r
+ static BOOL CheckMsysGitDir();\r
+\r
+// static CString m_MsysGitPath;\r
CGit(void);\r
~CGit(void);\r
int Run(CString cmd, CString* output);\r
BRANCH_ALL=BRANCH_LOCAL|BRANCH_REMOTE,\r
}BRANCH_TYPE;\r
\r
+ typedef enum\r
+ {\r
+ LOG_INFO_STAT=0x1,\r
+ LOG_INFO_FILESTATE=0x2,\r
+ LOG_INFO_PATCH=0x4,\r
+ }LOG_INFO_MASK;\r
+\r
int GetRemoteList(STRING_VECTOR &list);\r
int GetBranchList(STRING_VECTOR &list, int *Current,BRANCH_TYPE type=BRANCH_LOCAL);\r
int GetTagList(STRING_VECTOR &list);\r
int GetMapHashToFriendName(MAP_HASH_NAME &map);\r
\r
//hash is empty means all. -1 means all\r
- int GetLog(CString& logOut,CString &hash, int count=-1);\r
+ int GetLog(CString& logOut,CString &hash, CTGitPath *path = NULL,int count=-1,int InfoMask=LOG_INFO_STAT|LOG_INFO_FILESTATE);\r
\r
git_revnum_t GetHash(CString &friendname);\r
\r
CString onelog;\r
TCHAR oldmark=this->m_Mark;\r
\r
- git->GetLog(onelog,m_CommitHash,1);\r
+ git->GetLog(onelog,m_CommitHash,NULL,1);\r
CString oldhash=m_CommitHash;\r
ParserFromLog(onelog);\r
\r
IDS_LOG_AUTHOR "Author"\r
IDS_LOG_DATE "Date"\r
IDS_LOG_BUGIDS "Bug-ID"\r
+ IDS_LOG_ID "ID"\r
END\r
\r
virtual void Dump(CDumpContext& dc) const;\r
#endif\r
\r
+ COutputWnd m_wndOutput;\r
+\r
protected: // control bar embedded members\r
CMFCMenuBar m_wndMenuBar;\r
CMFCToolBar m_wndToolBar;\r
CMFCStatusBar m_wndStatusBar;\r
CMFCToolBarImages m_UserImages;\r
- COutputWnd m_wndOutput;\r
+ \r
CPropertiesWnd m_wndProperties;\r
\r
// Generated message map functions\r
\r
m_wndTabs.AddTab(&m_LogList, strTabName, (UINT)0);\r
\r
+ m_LogList.m_IsIDReplaceAction=TRUE;\r
m_LogList.DeleteAllItems();\r
m_LogList.InsertGitColumn();\r
\r
// m_wndOutputFind.AddString(_T("but you can change the way it is displayed as you wish..."));\r
}\r
\r
+int COutputWnd::LoadHistory(CString filename)\r
+{\r
+ m_LogList.ReloadHashMap();\r
+ CTGitPath path;\r
+ path.SetFromWin(filename);\r
+\r
+ m_LogList.FillGitLog(&path,0);\r
+\r
+ return 0;\r
+\r
+}\r
/////////////////////////////////////////////////////////////////////////////\r
// COutputList1\r
\r
}\r
}\r
\r
-\r
public:\r
virtual ~COutputWnd();\r
\r
+ int LoadHistory(CString filename);\r
+\r
protected:\r
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);\r
afx_msg void OnSize(UINT nType, int cx, int cy);\r
#define IDS_LOG_DATE 1210\r
#define IDS_LOG_REVISION 1208\r
#define IDS_LOG_BUGIDS 1840\r
+#define IDS_LOG_ID 9605\r
// Next default values for new objects\r
//\r
#ifdef APSTUDIO_INVOKED\r
#include "TortoiseGitBlame.h"\r
\r
#include "TortoiseGitBlameDoc.h"\r
+#include "GitAdminDir.h"\r
+#include "MessageBox.h"\r
+#include "Git.h"\r
+#include "MainFrm.h"\r
\r
#ifdef _DEBUG\r
#define new DEBUG_NEW\r
return TRUE;\r
}\r
\r
+BOOL CTortoiseGitBlameDoc::OnOpenDocument(LPCTSTR lpszPathName)\r
+{\r
+ if (!CDocument::OnOpenDocument(lpszPathName))\r
+ return FALSE;\r
+\r
+ // TODO: add reinitialization code here\r
+ // (SDI documents will reuse this document)\r
+ if(!CGit::CheckMsysGitDir())\r
+ {\r
+ CMessageBox::Show(NULL,_T("MsysGit have not install or config fail"),_T("TortoiseGitBlame"),MB_OK);\r
+ return FALSE;\r
+ }\r
\r
+ GitAdminDir admindir;\r
+ CString topdir;\r
+ if(!admindir.HasAdminDir(lpszPathName,&topdir))\r
+ {\r
+ CMessageBox::Show(NULL,CString(lpszPathName)+_T(" is not controled by git\nJust Show File Context"),_T("TortoiseGitBlame"),MB_OK);\r
+ }else\r
+ {\r
+ m_IsGitFile=TRUE;\r
+ g_Git.m_CurrentDir=topdir;\r
+ GetMainFrame()->m_wndOutput.LoadHistory(lpszPathName);\r
+ }\r
+\r
+ return TRUE;\r
+}\r
\r
\r
// CTortoiseGitBlameDoc serialization\r
\r
#pragma once\r
\r
+class CMainFrame ;\r
\r
class CTortoiseGitBlameDoc : public CDocument\r
{\r
\r
// Operations\r
public:\r
-\r
+ BOOL m_IsGitFile;\r
// Overrides\r
public:\r
virtual BOOL OnNewDocument();\r
virtual void Serialize(CArchive& ar);\r
-\r
+ virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);\r
// Implementation\r
public:\r
virtual ~CTortoiseGitBlameDoc();\r
virtual void AssertValid() const;\r
virtual void Dump(CDumpContext& dc) const;\r
#endif\r
+ CMainFrame *GetMainFrame()\r
+ {\r
+ return (CMainFrame*)AfxGetApp()->GetMainWnd();\r
+ }\r
\r
protected:\r
-\r
+ \r
+ \r
// Generated message map functions\r
protected:\r
DECLARE_MESSAGE_MAP()\r
\r
m_bShowBugtraqColumn=0;\r
\r
+ m_IsIDReplaceAction=FALSE;\r
+\r
m_wcRev.m_CommitHash=GIT_REV_ZERO;\r
m_wcRev.m_Subject=_T("Working Copy");\r
\r
// CString log;\r
// g_Git.GetLog(log);\r
\r
- temp.LoadString(IDS_LOG_ACTIONS);\r
- InsertColumn(this->LOGLIST_ACTION, temp);\r
- \r
+ if(m_IsIDReplaceAction)\r
+ {\r
+ temp.LoadString(IDS_LOG_ID);\r
+ InsertColumn(this->LOGLIST_ACTION, temp);\r
+ }\r
+ else\r
+ {\r
+ temp.LoadString(IDS_LOG_ACTIONS);\r
+ InsertColumn(this->LOGLIST_ACTION, temp);\r
+ }\r
temp.LoadString(IDS_LOG_MESSAGE);\r
InsertColumn(this->LOGLIST_MESSAGE, temp);\r
\r
\r
if (pLVCD->iSubItem == 1)\r
{\r
+ if(this->m_IsIDReplaceAction)\r
+ {\r
+ *pResult = CDRF_DODEFAULT;\r
+ return;\r
+ }\r
*pResult = CDRF_DODEFAULT;\r
\r
if (m_arShownList.GetCount() <= (INT_PTR)pLVCD->nmcd.dwItemSpec)\r
if (itemid < m_arShownList.GetCount())\r
pLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(pItem->iItem));\r
\r
+ CString temp;\r
+ temp.Format(_T("%d"),m_arShownList.GetCount()-pItem->iItem);\r
\r
// Which column?\r
switch (pItem->iSubItem)\r
}\r
break;\r
case this->LOGLIST_ACTION: //action -- no text in the column\r
+ if(this->m_IsIDReplaceAction)\r
+ lstrcpyn(pItem->pszText, temp, pItem->cchTextMax);\r
break;\r
case this->LOGLIST_MESSAGE: //Message\r
if (pLogEntry)\r
*pResult = -1;\r
}\r
\r
+int CGitLogListBase::FillGitLog(CTGitPath *path,int info)\r
+{\r
+ ClearText();\r
+\r
+ this->m_logEntries.ClearAll();\r
+ this->m_logEntries.ParserFromLog(path,-1,info);\r
+\r
+ //this->m_logEntries.ParserFromLog();\r
+ SetItemCountEx(this->m_logEntries.size());\r
+\r
+ this->m_arShownList.RemoveAll();\r
+\r
+ for(int i=0;i<m_logEntries.size();i++)\r
+ {\r
+ m_logEntries[i].m_IsFull=TRUE;\r
+ this->m_arShownList.Add(&m_logEntries[i]);\r
+ }\r
+ return 0;\r
+\r
+}\r
+\r
int CGitLogListBase::FillGitShortLog()\r
{\r
ClearText();\r
CGitLogListBase();\r
virtual ~CGitLogListBase();\r
volatile LONG m_bNoDispUpdates;\r
+ BOOL m_IsIDReplaceAction;\r
BOOL m_bStrictStopped;\r
BOOL m_bShowBugtraqColumn;\r
BOOL m_bSearchIndex;\r
void DiffSelectedRevWithPrevious();\r
bool IsSelectionContinuous();\r
int FillGitShortLog();\r
+ int FillGitLog(CTGitPath *path,int infomask=CGit:: LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE);\r
+\r
inline int ShownCountWithStopped() const { return (int)m_arShownList.GetCount() + (m_bStrictStopped ? 1 : 0); }\r
int FetchLogAsync(CALLBACK_PROCESS *proc=NULL, void * data=NULL);\r
CPtrArray m_arShownList;\r
CTime m_To;\r
void GetTimeRange(CTime &oldest,CTime &latest);\r
virtual void ContextMenuAction(int cmd,int FirstSelect, int LastSelect)=0;\r
+ void ReloadHashMap()\r
+ { \r
+ m_HashMap.clear();\r
+ g_Git.GetMapHashToFriendName(m_HashMap);\r
+ }\r
protected:\r
DECLARE_MESSAGE_MAP()\r
afx_msg void OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult);\r
return at(i).SafeFetchFullInfo(&g_Git);
}
//CLogDataVector Class
-int CLogDataVector::ParserFromLog()
+int CLogDataVector::ParserFromLog(CTGitPath *path ,int count ,int infomask)
{
CString log;
GitRev rev;
CString emptyhash;
- g_Git.GetLog(log,emptyhash);
+ g_Git.GetLog(log,emptyhash,path,count,infomask);
CString begin;
begin.Format(_T("#<%c>"),LOG_REV_ITEM_BEGIN);
m_FirstFreeLane=0;\r
}\r
void ClearAll();\r
- int ParserFromLog();\r
+ int ParserFromLog(CTGitPath *path =NULL,int count = -1,int infomask=CGit::LOG_INFO_STAT|CGit::LOG_INFO_FILESTATE);\r
int ParserShortLog(CTGitPath *path =NULL,int count = -1 );\r
int FetchFullInfo(int i);\r
\r
END_MESSAGE_MAP()\r
\r
CString g_version;\r
-CString CGit::m_MsysGitPath;\r
+//CString CGit::m_MsysGitPath;\r
//////////////////////////////////////////////////////////////////////////\r
\r
CTortoiseProcApp::CTortoiseProcApp()\r
\r
BOOL CTortoiseProcApp::CheckMsysGitDir()\r
{\r
- CRegString msysdir=CRegString(_T("Software\\TortoiseGit\\MSysGit"),_T(""),FALSE,HKEY_LOCAL_MACHINE);\r
- CString str=msysdir;\r
- if(str.IsEmpty())\r
- {\r
- CRegString msysinstalldir=CRegString(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1\\InstallLocation"),_T(""),FALSE,HKEY_LOCAL_MACHINE);\r
- str=msysinstalldir;\r
- str+="\\bin";\r
- msysdir=str;\r
- msysdir.write();\r
-\r
- }\r
- CGit::m_MsysGitPath=str;\r
-\r
- TCHAR *oldpath,*home;\r
- size_t size;\r
-\r
- _tdupenv_s(&home,&size,_T("HOME")); \r
- \r
- if(home == NULL)\r
- { \r
- _tdupenv_s(&home,&size,_T("USERPROFILE")); \r
- _tputenv_s(_T("HOME"),home);\r
- free(home);\r
- }\r
- //set path\r
- _tdupenv_s(&oldpath,&size,_T("PATH")); \r
-\r
- CString path;\r
- path.Format(_T("%s;"),str);\r
- path+=oldpath;\r
-\r
- _tputenv_s(_T("PATH"),path);\r
-\r
- free(oldpath);\r
-\r
- CString cmd,out;\r
- cmd=_T("git.exe --version");\r
- if(g_Git.Run(cmd,&out))\r
- {\r
- return false;\r
- }\r
- else\r
- return true;\r
- \r
+ return CGit::CheckMsysGitDir(); \r
}\r
CCrashReport crasher("tortoisegit-bug@googlegroups.com", "Crash Report for TortoiseGit " APP_X64_STRING " : " STRPRODUCTVER, TRUE);// crash\r
\r