#include "StdAfx.h"\r
#include "GitDiff.h"\r
#include "AppUtils.h"\r
+#include "git.h"\r
+#include "gittype.h"\r
+#include "resource.h"\r
+#include "MessageBox.h"\r
\r
CGitDiff::CGitDiff(void)\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
+int CGitDiff::Parser(git_revnum_t &rev)\r
+{\r
+ if(rev == GIT_REV_ZERO)\r
+ return 0;\r
+ if(rev.GetLength() > 40)\r
+ {\r
+ CString cmd;\r
+ cmd.Format(_T("git.exe rev-parse %s"),rev);\r
+ CString output;\r
+ if(!g_Git.Run(cmd,&output,CP_UTF8))\r
+ {\r
+ //int start=output.Find(_T('\n'));\r
+ rev=output.Left(40);\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+int CGitDiff::DiffNull(CTGitPath *pPath, git_revnum_t &rev1,bool bIsAdd)\r
{\r
CString temppath;\r
GetTempPath(temppath);\r
+ Parser(rev1);\r
+ CString file1;\r
+ CString nullfile;\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.exe cat-file -p %s:\"%s\""),rev1,pPath->GetGitPathString());\r
+ g_Git.RunLogFile(cmd,file1);\r
+ }else\r
+ {\r
+ file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();\r
+ }\r
+\r
+ CString tempfile=::GetTempFile();\r
+ CStdioFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate );\r
+ //file.WriteString();\r
+ file.Close();\r
\r
+ CAppUtils::DiffFlags flags;\r
+\r
+ if(bIsAdd)\r
+ CAppUtils::StartExtDiff(tempfile,file1,\r
+ _T("NULL"),\r
+ pPath->GetGitPathString()+_T(":")+rev1.Left(6)\r
+ ,flags);\r
+ else\r
+ CAppUtils::StartExtDiff(file1,tempfile,\r
+ pPath->GetGitPathString()+_T(":")+rev1.Left(6)\r
+ ,_T("NULL"),flags);\r
+\r
+ return 0;\r
+}\r
+\r
+int CGitDiff::SubmoduleDiff(CTGitPath * pPath,CTGitPath * pPath2, git_revnum_t & rev1, git_revnum_t & rev2, bool /*blame*/, bool /*unified*/)\r
+{\r
+ CString oldhash;\r
+ CString newhash;\r
+ CString cmd,err;\r
+ CString workingcopy;\r
+\r
+ if( rev2 == GIT_REV_ZERO || rev1 == GIT_REV_ZERO )\r
+ {\r
+ oldhash = GIT_REV_ZERO;\r
+ newhash = GIT_REV_ZERO;\r
+\r
+ CString rev;\r
+ if( rev2 != GIT_REV_ZERO )\r
+ rev = rev2;\r
+ if( rev1 != GIT_REV_ZERO )\r
+ rev = rev1;\r
+ \r
+ workingcopy = _T("(Work Copy)");\r
+\r
+ cmd.Format(_T("git.exe diff %s -- \"%s\""),\r
+ rev,pPath->GetGitPathString());\r
+\r
+ CString output;\r
+ if(g_Git.Run(cmd,&output,CP_ACP))\r
+ {\r
+ CMessageBox::Show(NULL,output,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return -1;\r
+ }\r
+ int start =0;\r
+ int oldstart = output.Find(_T("-Subproject commit"),start);\r
+ if(oldstart<0)\r
+ {\r
+ CMessageBox::Show(NULL,_T("Subproject Diff Format error") ,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return -1;\r
+ }\r
+ oldhash = output.Mid(oldstart+ CString(_T("-Subproject commit")).GetLength()+1,40);\r
+ start = 0;\r
+ int newstart = output.Find(_T("+Subproject commit"),start);\r
+ if(oldstart<0)\r
+ {\r
+ CMessageBox::Show(NULL,_T("Subproject Diff Format error") ,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return -1;\r
+ }\r
+ newhash = output.Mid(newstart+ CString(_T("+Subproject commit")).GetLength()+1,40);\r
+ \r
+ }else\r
+ {\r
+ cmd.Format(_T("git.exe diff-tree -r -z %s %s -- \"%s\""),\r
+ rev2,rev1,pPath->GetGitPathString());\r
+ \r
+ BYTE_VECTOR bytes;\r
+ if(g_Git.Run(cmd,&bytes))\r
+ {\r
+ CString err;\r
+ g_Git.StringAppend(&err,&bytes[0],CP_ACP);\r
+ CMessageBox::Show(NULL,err,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return -1;\r
+ }\r
+\r
+ g_Git.StringAppend(&oldhash,&bytes[15],CP_ACP,40);\r
+ g_Git.StringAppend(&newhash,&bytes[15+41],CP_ACP,40);\r
+ \r
+ }\r
+ \r
+ CString oldsub;\r
+ CString newsub;\r
+\r
+ CGit subgit; \r
+ subgit.m_CurrentDir=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();\r
+\r
+ if(pPath->HasAdminDir())\r
+ {\r
+ int encode=CAppUtils::GetLogOutputEncode(&subgit);\r
+\r
+ if(oldhash != GIT_REV_ZERO)\r
+ {\r
+ cmd.Format(_T("git log -n1 HEAD --pretty=format:\"%%s\" %s"),oldhash);\r
+ subgit.Run(cmd,&oldsub,encode);\r
+ }\r
+ if(newsub != GIT_REV_ZERO)\r
+ {\r
+ cmd.Format(_T("git log -n1 HEAD --pretty=format:\"%%s\" %s"),newhash);\r
+ subgit.Run(cmd,&newsub,encode);\r
+ }\r
+ }\r
+ CString msg;\r
+ msg.Format(_T("Submodule <b>%s</b> Change\r\n\r\n<b>From:</b> %s\r\n\t%s\r\n\r\n<b>To%s:</b> %s\r\n\t\t%s"),\r
+ pPath->GetWinPath(),\r
+ oldhash,\r
+ oldsub ,\r
+ workingcopy,\r
+ newhash,\r
+ newsub);\r
+ CMessageBox::Show(NULL,msg,_T("TortoiseGit"),MB_OK);\r
+\r
+ return 0;\r
+}\r
+\r
+int CGitDiff::Diff(CTGitPath * pPath,CTGitPath * pPath2, git_revnum_t & rev1, git_revnum_t & rev2, bool /*blame*/, bool /*unified*/)\r
+{\r
+ CString temppath;\r
+ GetTempPath(temppath);\r
+ Parser(rev1);\r
+ Parser(rev2);\r
CString file1;\r
+ CString title1;\r
CString cmd;\r
+\r
+ if(pPath->IsDirectory() || pPath2->IsDirectory())\r
+ {\r
+ return SubmoduleDiff(pPath,pPath2,rev1,rev2);\r
+ }\r
+\r
if(rev1 != GIT_REV_ZERO )\r
{\r
file1.Format(_T("%s%s_%s%s"),\r
pPath->GetBaseFilename(),\r
rev1.Left(6),\r
pPath->GetFileExtension());\r
- cmd.Format(_T("git.exe cat-file -p %s:%s"),rev1,pPath->GetGitPathString());\r
+ title1 = pPath->GetFileOrDirectoryName()+_T(":")+rev1.Left(6);\r
+ cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev1,pPath->GetGitPathString());\r
g_Git.RunLogFile(cmd,file1);\r
}else\r
{\r
file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();\r
+ title1.Format( IDS_DIFF_WCNAME, pPath->GetFileOrDirectoryName() );\r
}\r
\r
CString file2;\r
+ CString title2;\r
if(rev2 != GIT_REV_ZERO)\r
{\r
\r
- file2.Format(_T("%s\\%s_%s%s"),\r
+ file2.Format(_T("%s%s_%s%s"),\r
temppath, \r
- pPath->GetBaseFilename(),\r
+ pPath2->GetBaseFilename(),\r
rev2.Left(6),\r
- pPath->GetFileExtension());\r
- cmd.Format(_T("git.exe cat-file -p %s:%s"),rev2,pPath->GetGitPathString());\r
+ pPath2->GetFileExtension());\r
+ title2 = pPath2->GetFileOrDirectoryName()+_T(":")+rev2.Left(6);\r
+ cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev2,pPath2->GetGitPathString());\r
g_Git.RunLogFile(cmd,file2);\r
}else\r
{\r
- file2=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();\r
+ file2=g_Git.m_CurrentDir+_T("\\")+pPath2->GetWinPathString();\r
+ title2.Format( IDS_DIFF_WCNAME, pPath2->GetFileOrDirectoryName() );\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
+ CAppUtils::StartExtDiff(file2,file1,\r
+ title2,\r
+ title1\r
,flags);\r
\r
return 0;\r
}\r
+\r