OSDN Git Service

Diff basic working at Commit Dlg box
authorFrank Li <lznuaa@gmail.com>
Sun, 30 Nov 2008 04:47:18 +0000 (12:47 +0800)
committerFrank Li <lznuaa@gmail.com>
Sun, 30 Nov 2008 04:47:18 +0000 (12:47 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
Git/Git.cpp
Git/Git.h
Git/GitRev.h
Git/GitStatusListCtrl.cpp
TortoiseProc/AppUtils.cpp
TortoiseProc/AppUtils.h
TortoiseProc/GitDiff.cpp [new file with mode: 0644]
TortoiseProc/GitDiff.h [new file with mode: 0644]
TortoiseProc/TortoiseProc.vcproj

index 43fa92c..43665ac 100644 (file)
@@ -212,3 +212,15 @@ int CGit::RunLogFile(CString cmd,CString &filename)
        return GIT_SUCCESS;\r
        return 0;\r
 }\r
+\r
+git_revnum_t CGit::GetHash(CString &friendname)\r
+{\r
+       CString cmd;\r
+       CString out;\r
+       cmd.Format(_T("git.cmd rev-parse %s" ),friendname);\r
+       Run(cmd,&out);\r
+       int pos=out.ReverseFind(_T('\n'));\r
+       if(pos>0)\r
+               return out.Left(pos);\r
+       return out;\r
+}
\ No newline at end of file
index 8425d11..f1f0d09 100644 (file)
--- a/Git/Git.h
+++ b/Git/Git.h
@@ -1,4 +1,6 @@
 #pragma once\r
+#include "GitRev.h"\r
+#include "GitStatus.h"\r
 \r
 enum\r
 {\r
@@ -19,6 +21,7 @@ public:
        CString GetCurrentBranch(void);\r
        CString m_CurrentDir;\r
        int GetLog(CString& logOut);\r
+       git_revnum_t GetHash(CString &friendname);\r
        \r
 };\r
 extern void GetTempPath(CString &path);\r
index 53b95c3..718e584 100644 (file)
@@ -34,7 +34,8 @@ public:
                REV_WC = -3,                    ///< revision of the working copy\r
                REV_UNSPECIFIED = -4,   ///< unspecified revision\r
        };\r
-\r
+       static CString GetHead(){return CString(_T("HEAD"));};\r
+       static CString GetWorkingCopy(){return CString(GIT_REV_ZERO);};\r
        CString m_AuthorName;\r
        CString m_AuthorEmail;\r
        CTime   m_AuthorDate;\r
index d90edf7..ba36ec7 100644 (file)
@@ -34,7 +34,7 @@
 #include "GitConfig.h"\r
 //#include "SVNProperties.h"\r
 #include "Git.h"\r
-//#include "SVNDiff.h"\r
+#include "GitDiff.h"\r
 //#include "LogDlg.h"\r
 //#include "SVNProgressDlg.h"\r
 #include "SysImageList.h"\r
@@ -2452,6 +2452,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
        if (fullver >= 0x0501)\r
                XPorLater = true;\r
        bool bShift = !!(GetAsyncKeyState(VK_SHIFT) & 0x8000);\r
+       CTGitPath * filepath;\r
 \r
        int selIndex = GetSelectionMark();\r
        if ((point.x == -1) && (point.y == -1))\r
@@ -2471,7 +2472,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
        {\r
                //FileEntry * entry = GetListEntry(selIndex);\r
 \r
-               CTGitPath * filepath = (CTGitPath * )GetItemData(selIndex);\r
+               filepath = (CTGitPath * )GetItemData(selIndex);\r
 \r
                ASSERT(filepath != NULL);\r
                if (filepath == NULL)\r
@@ -2836,6 +2837,18 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
+                       case IDSVNLC_GNUDIFF1:\r
+                               {\r
+                               //      SVNDiff diff(NULL, this->m_hWnd, true);\r
+                               //\r
+                               //      if (entry->remotestatus <= git_wc_status_normal)\r
+                               //              CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_BASE, entry->path, SVNRev::REV_WC);\r
+                               //      else\r
+                               //              CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_WC, entry->path, SVNRev::REV_HEAD);\r
+                                       CAppUtils::StartShowUnifiedDiff(m_hWnd,*filepath,GitRev::GetWorkingCopy(),\r
+                                                                                                                       *filepath,GitRev::GetHead());\r
+                               }\r
+                               break;\r
 \r
 #if 0\r
                        case IDSVNLC_COPY:\r
@@ -4085,12 +4098,13 @@ void CGitStatusListCtrl::CreateChangeList(const CString& name)
 \r
 void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)\r
 {\r
-#if 0\r
+\r
        Locker lock(m_critSec);\r
        LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);\r
        *pResult = 0;\r
        if (m_bBlock)\r
                return;\r
+#if 0\r
        if (pNMLV->iItem < 0)\r
        {\r
                if (!IsGroupViewEnabled())\r
@@ -4142,23 +4156,28 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
                NotifyCheck();\r
                return;\r
        }\r
-       FileEntry * entry = GetListEntry(pNMLV->iItem);\r
-       if (entry)\r
-       {\r
-               if (entry->isConflicted)\r
-               {\r
-                       gitDiff::StartConflictEditor(entry->GetPath());\r
-               }\r
-               else\r
+#endif\r
+//     FileEntry * entry = GetListEntry(pNMLV->iItem);\r
+//     if (entry)\r
+       {\r
+//             if (entry->isConflicted)\r
+//             {\r
+//                     gitDiff::StartConflictEditor(entry->GetPath());\r
+//             }\r
+//             else\r
                {\r
                        StartDiff(pNMLV->iItem);\r
                }\r
        }\r
-#endif\r
+\r
 }\r
 \r
 void CGitStatusListCtrl::StartDiff(int fileindex)\r
 {\r
+       CGitDiff::Diff((CTGitPath*)GetItemData(fileindex),\r
+                               CString(GIT_REV_ZERO),\r
+                                       GitRev::GetHead());\r
+       \r
 #if 0\r
        if (fileindex < 0)\r
                return;\r
index 28c1eaf..15765b2 100644 (file)
@@ -310,17 +310,16 @@ bool CAppUtils::StartExtDiff(
        {\r
                viewer.Replace(_T("%mine"),  _T("\"")+file2+_T("\""));\r
        }\r
-#if 0\r
+\r
        if (sName1.IsEmpty())\r
-               viewer.Replace(_T("%bname"), _T("\"") + file1.GetUIFileOrDirectoryName() + _T("\""));\r
+               viewer.Replace(_T("%bname"), _T("\"") + file1 + _T("\""));\r
        else\r
                viewer.Replace(_T("%bname"), _T("\"") + sName1 + _T("\""));\r
 \r
        if (sName2.IsEmpty())\r
-               viewer.Replace(_T("%yname"), _T("\"") + file2.GetUIFileOrDirectoryName() + _T("\""));\r
+               viewer.Replace(_T("%yname"), _T("\"") + file2 + _T("\""));\r
        else\r
                viewer.Replace(_T("%yname"), _T("\"") + sName2 + _T("\""));\r
-#endif\r
 \r
        if (flags.bReadOnly && bInternal)\r
                viewer += _T(" /readonly");\r
@@ -976,11 +975,25 @@ CString CAppUtils::GetProjectNameFromURL(CString url)
        return name;\r
 }\r
 \r
-bool CAppUtils::StartShowUnifiedDiff(HWND hWnd, const CTGitPath& url1, const GitRev& rev1, \r
-                                                                        const CTGitPath& url2, const GitRev& rev2, \r
-                                                                        const GitRev& peg /* = GitRev */, const GitRev& headpeg /* = GitRev */,  \r
-                                                                        bool bAlternateDiff /* = false */, bool bIgnoreAncestry /* = false */, bool /* blame = false */)\r
+bool CAppUtils::StartShowUnifiedDiff(HWND hWnd, const CTGitPath& url1, const git_revnum_t& rev1, \r
+                                                                                               const CTGitPath& url2, const git_revnum_t& rev2, \r
+                                                                        //const GitRev& peg /* = GitRev */, const GitRev& headpeg /* = GitRev */,  \r
+                                                                                               bool bAlternateDiff /* = false */, bool bIgnoreAncestry /* = false */, bool /* blame = false */)\r
 {\r
+\r
+       CString tempfile=GetTempFile();\r
+       CString cmd;\r
+       if(rev1 == GitRev::GetWorkingCopy())\r
+       {\r
+               cmd.Format(_T("git.cmd diff --stat -p %s"),rev2);\r
+       }else\r
+       {       \r
+               cmd.Format(_T("git.cmd diff-tree -r -p --stat %s %s"),rev1,rev2);\r
+       }\r
+       g_Git.RunLogFile(cmd,tempfile);\r
+       CAppUtils::StartUnifiedDiffViewer(tempfile,rev1.Left(6)+_T(":")+rev2.Left(6));\r
+\r
+\r
 #if 0\r
        CString sCmd;\r
        sCmd.Format(_T("%s /command:showcompare /unified"),\r
index ab81065..030e8fc 100644 (file)
@@ -143,12 +143,13 @@ public:
        /**\r
         * Replacement for GitDiff::ShowUnifiedDiff(), but started as a separate process.\r
         */\r
-       static bool StartShowUnifiedDiff(HWND hWnd, const CTGitPath& url1, const GitRev& rev1, \r
-                                                                       const CTGitPath& url2, const GitRev& rev2, \r
-                                                                       const GitRev& peg = GitRev(), const GitRev& headpeg = GitRev(),\r
-                                                                       bool bAlternateDiff = false,\r
-                                                                       bool bIgnoreAncestry = false,\r
-                                    bool /* blame */ = false);\r
+       static bool StartShowUnifiedDiff(HWND hWnd, const CTGitPath& url1,  const git_revnum_t& rev1, \r
+                                                                                               const CTGitPath & url2, const git_revnum_t& rev2, \r
+\r
+                                                                                               //const GitRev& peg = GitRev(), const GitRev& headpeg = GitRev(),\r
+                                                                                               bool bAlternateDiff = false,\r
+                                                                                               bool bIgnoreAncestry = false,\r
+                                                                                               bool /* blame */ = false);\r
 \r
        /**\r
         * Replacement for GitDiff::ShowCompare(), but started as a separate process.\r
diff --git a/TortoiseProc/GitDiff.cpp b/TortoiseProc/GitDiff.cpp
new file mode 100644 (file)
index 0000000..9dde4bd
--- /dev/null
@@ -0,0 +1,57 @@
+#include "StdAfx.h"\r
+#include "GitDiff.h"\r
+#include "AppUtils.h"\r
+\r
+CGitDiff::CGitDiff(void)\r
+{\r
+}\r
+\r
+CGitDiff::~CGitDiff(void)\r
+{\r
+}\r
+\r
+int CGitDiff::Diff(CTGitPath * pPath, git_revnum_t & rev1, git_revnum_t & rev2, bool blame, bool unified)\r
+{\r
+       CString temppath;\r
+       GetTempPath(temppath);\r
+       \r
+       CString file1;\r
+       CString cmd;\r
+       if(rev1 != GIT_REV_ZERO )\r
+       {\r
+               file1.Format(_T("%s%s_%s%s"),\r
+                               temppath,                                               \r
+                               pPath->GetBaseFilename(),\r
+                               rev1.Left(6),\r
+                               pPath->GetFileExtension());\r
+               cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev1,pPath->GetGitPathString());\r
+                               g_Git.RunLogFile(cmd,file1);\r
+       }else\r
+       {\r
+               file1=pPath->GetWinPathString();\r
+       }\r
+\r
+       CString file2;\r
+       if(rev2 != GIT_REV_ZERO)\r
+       {\r
+               \r
+               file2.Format(_T("%s\\%s_%s%s"),\r
+                               temppath,                                               \r
+                               pPath->GetBaseFilename(),\r
+                               rev2.Left(6),\r
+                               pPath->GetFileExtension());\r
+               cmd.Format(_T("git.cmd cat-file -p %s:%s"),rev2,pPath->GetGitPathString());\r
+               g_Git.RunLogFile(cmd,file2);\r
+       }else\r
+       {\r
+               file2=pPath->GetWinPathString();\r
+       }\r
+       \r
+       CAppUtils::DiffFlags flags;\r
+       CAppUtils::StartExtDiff(file1,file2,\r
+                                                       pPath->GetGitPathString()+_T(":")+rev1.Left(6),\r
+                                                       pPath->GetGitPathString()+_T(":")+rev2.Left(6)\r
+                                                       ,flags);\r
+\r
+       return 0;\r
+}\r
diff --git a/TortoiseProc/GitDiff.h b/TortoiseProc/GitDiff.h
new file mode 100644 (file)
index 0000000..b40524c
--- /dev/null
@@ -0,0 +1,14 @@
+#pragma once\r
+#include "TGitPath.h"\r
+#include "GitStatus.h"\r
+#include "Git.h"\r
+\r
+class CGitDiff\r
+{\r
+public:\r
+       CGitDiff(void);\r
+       ~CGitDiff(void);\r
+       \r
+\r
+       static int Diff(CTGitPath * pPath, git_revnum_t & rev1, git_revnum_t & rev2, bool blame=false, bool unified=false);\r
+};\r
index 016d2ab..e4779c1 100644 (file)
                        Name="Git"\r
                        >\r
                        <File\r
+                               RelativePath=".\GitDiff.cpp"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\GitDiff.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath="..\Git\GitStatusListCtrl.cpp"\r
                                >\r
                        </File>\r