OSDN Git Service

Add Reversfind return value check at submodule updater
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitDiff.cpp
index 88adbf2..f30b89e 100644 (file)
@@ -1,6 +1,10 @@
 #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
@@ -9,14 +13,179 @@ CGitDiff::CGitDiff(void)
 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
@@ -24,34 +193,40 @@ int CGitDiff::Diff(CTGitPath * pPath, git_revnum_t & rev1, git_revnum_t & rev2,
                                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