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
#pragma once\r
+#include "GitRev.h"\r
+#include "GitStatus.h"\r
\r
enum\r
{\r
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
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
#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
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
{\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
}\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
\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
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
{\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
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
/**\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
--- /dev/null
+#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
--- /dev/null
+#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
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