OSDN Git Service

Git Blame Can Show Log
authorFrank Li <lznuaa@gmail.com>
Sun, 11 Jan 2009 13:52:12 +0000 (21:52 +0800)
committerFrank Li <lznuaa@gmail.com>
Sun, 11 Jan 2009 13:52:12 +0000 (21:52 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
16 files changed:
src/Git/Git.cpp
src/Git/Git.h
src/Git/GitRev.cpp
src/Resources/TortoiseGitBlame.rc2
src/TortoiseGitBlame/MainFrm.h
src/TortoiseGitBlame/OutputWnd.cpp
src/TortoiseGitBlame/OutputWnd.h
src/TortoiseGitBlame/Resource.h
src/TortoiseGitBlame/TortoiseGitBlameDoc.cpp
src/TortoiseGitBlame/TortoiseGitBlameDoc.h
src/TortoiseProc/GitLogListBase.cpp
src/TortoiseProc/GitLogListBase.h
src/TortoiseProc/LogDataVector.cpp
src/TortoiseProc/LogDlgHelper.h
src/TortoiseProc/TortoiseProc.cpp
src/TortoiseProc/resource.h

index 87c5d89..764e475 100644 (file)
@@ -2,6 +2,7 @@
 #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
@@ -194,21 +195,36 @@ int CGit::BuildOutputFormat(CString &format,bool IsFull)
        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
@@ -431,4 +447,52 @@ int CGit::GetMapHashToFriendName(MAP_HASH_NAME &map)
                }\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
index d5eeae8..1070a36 100644 (file)
@@ -19,7 +19,9 @@ class CGit
 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
@@ -42,13 +44,20 @@ public:
                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
index 9ec85e3..9513952 100644 (file)
@@ -160,7 +160,7 @@ int GitRev::SafeFetchFullInfo(CGit *git)
                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
index b0a80df..44b4966 100644 (file)
@@ -23,5 +23,6 @@ BEGIN
     IDS_LOG_AUTHOR          "Author"\r
     IDS_LOG_DATE            "Date"\r
        IDS_LOG_BUGIDS          "Bug-ID"\r
+       IDS_LOG_ID                              "ID"\r
 END\r
 \r
index fbaf732..36f6a27 100644 (file)
@@ -32,12 +32,14 @@ public:
        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
index ba5b681..23d9e1e 100644 (file)
@@ -77,6 +77,7 @@ int COutputWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 \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
@@ -146,6 +147,17 @@ void COutputWnd::FillFindWindow()
 //     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
@@ -212,4 +224,3 @@ void COutputList::OnViewOutput()
        }\r
 }\r
 \r
-\r
index 33983cb..5d2ae09 100644 (file)
@@ -52,6 +52,8 @@ protected:
 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
index b35d269..0b3e399 100644 (file)
@@ -55,6 +55,7 @@
 #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
index a04d238..b7afbc6 100644 (file)
@@ -6,6 +6,10 @@
 #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
@@ -43,7 +47,33 @@ BOOL CTortoiseGitBlameDoc::OnNewDocument()
        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
index cf115c1..53c5e9b 100644 (file)
@@ -5,6 +5,7 @@
 \r
 #pragma once\r
 \r
+class CMainFrame ;\r
 \r
 class CTortoiseGitBlameDoc : public CDocument\r
 {\r
@@ -17,12 +18,12 @@ public:
 \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
@@ -30,9 +31,14 @@ public:
        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
index 62250c0..a45e220 100644 (file)
@@ -70,6 +70,8 @@ CGitLogListBase::CGitLogListBase():CHintListCtrl()
        \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
@@ -152,9 +154,16 @@ void CGitLogListBase::InsertGitColumn()
 //     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
@@ -762,6 +771,11 @@ void CGitLogListBase::OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                        \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
@@ -834,6 +848,8 @@ void CGitLogListBase::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)
        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
@@ -844,6 +860,8 @@ void CGitLogListBase::OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult)
                }\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
@@ -1286,6 +1304,27 @@ void CGitLogListBase::OnLvnOdfinditemLoglist(NMHDR *pNMHDR, LRESULT *pResult)
        *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
index ad4a3ac..9548b9b 100644 (file)
@@ -63,6 +63,7 @@ public:
        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
@@ -130,6 +131,8 @@ public:
        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
@@ -146,6 +149,11 @@ public:
        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
index 516cb47..b7e4096 100644 (file)
@@ -107,12 +107,12 @@ int CLogDataVector::FetchFullInfo(int i)
        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);
index dd3df54..f0dbc2d 100644 (file)
@@ -58,7 +58,7 @@ public:
                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
index ae9d085..7e430f4 100644 (file)
@@ -57,7 +57,7 @@ BEGIN_MESSAGE_MAP(CTortoiseProcApp, CWinAppEx)
 END_MESSAGE_MAP()\r
 \r
 CString g_version;\r
-CString CGit::m_MsysGitPath;\r
+//CString CGit::m_MsysGitPath;\r
 //////////////////////////////////////////////////////////////////////////\r
 \r
 CTortoiseProcApp::CTortoiseProcApp()\r
@@ -105,50 +105,7 @@ CString sOrigCWD;
 \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
index bec6414..10e0aaf 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ