#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
}\r
return 0;\r
}\r
-int CGitDiff::DiffNull(CTGitPath *pPath, git_revnum_t &rev1)\r
+int CGitDiff::DiffNull(CTGitPath *pPath, git_revnum_t &rev1,bool bIsAdd)\r
{\r
CString temppath;\r
GetTempPath(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
+ cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev1,pPath->GetGitPathString());\r
g_Git.RunLogFile(cmd,file1);\r
}else\r
{\r
file.Close();\r
\r
CAppUtils::DiffFlags flags;\r
- CAppUtils::StartExtDiff(tempfile,file1,\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
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
rev1.Left(6),\r
pPath->GetFileExtension());\r
title1 = pPath->GetFileOrDirectoryName()+_T(":")+rev1.Left(6);\r
- cmd.Format(_T("git.exe cat-file -p %s:%s"),rev1,pPath->GetGitPathString());\r
+ cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev1,pPath->GetGitPathString());\r
g_Git.RunLogFile(cmd,file1);\r
}else\r
{\r
rev2.Left(6),\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
+ cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev2,pPath2->GetGitPathString());\r
g_Git.RunLogFile(cmd,file2);\r
}else\r
{\r
return 0;\r
}\r
\r
-int CGitDiff::StartConflictEditor(CTGitPath* /*file*/)\r
-{\r
- return 0;\r
-}
\ No newline at end of file