3 #include "AppUtils.h"
\r
6 #include "resource.h"
\r
7 #include "MessageBox.h"
\r
9 CGitDiff::CGitDiff(void)
\r
13 CGitDiff::~CGitDiff(void)
\r
16 int CGitDiff::Parser(git_revnum_t &rev)
\r
18 if(rev == GIT_REV_ZERO)
\r
20 if(rev.GetLength() > 40)
\r
23 cmd.Format(_T("git.exe rev-parse %s"),rev);
\r
25 if(!g_Git.Run(cmd,&output,CP_UTF8))
\r
27 //int start=output.Find(_T('\n'));
\r
28 rev=output.Left(40);
\r
33 int CGitDiff::DiffNull(CTGitPath *pPath, git_revnum_t &rev1,bool bIsAdd)
\r
36 GetTempPath(temppath);
\r
41 if(rev1 != GIT_REV_ZERO )
\r
43 file1.Format(_T("%s%s_%s%s"),
\r
45 pPath->GetBaseFilename(),
\r
47 pPath->GetFileExtension());
\r
48 cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev1,pPath->GetGitPathString());
\r
49 g_Git.RunLogFile(cmd,file1);
\r
52 file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();
\r
55 CString tempfile=::GetTempFile();
\r
56 CStdioFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate );
\r
57 //file.WriteString();
\r
60 CAppUtils::DiffFlags flags;
\r
63 CAppUtils::StartExtDiff(tempfile,file1,
\r
65 pPath->GetGitPathString()+_T(":")+rev1.Left(6)
\r
68 CAppUtils::StartExtDiff(file1,tempfile,
\r
69 pPath->GetGitPathString()+_T(":")+rev1.Left(6)
\r
75 int CGitDiff::SubmoduleDiff(CTGitPath * pPath,CTGitPath * pPath2, git_revnum_t & rev1, git_revnum_t & rev2, bool /*blame*/, bool /*unified*/)
\r
80 CString workingcopy;
\r
82 if( rev2 == GIT_REV_ZERO || rev1 == GIT_REV_ZERO )
\r
84 oldhash = GIT_REV_ZERO;
\r
85 newhash = GIT_REV_ZERO;
\r
88 if( rev2 != GIT_REV_ZERO )
\r
90 if( rev1 != GIT_REV_ZERO )
\r
93 workingcopy = _T("(Work Copy)");
\r
95 cmd.Format(_T("git.exe diff %s -- \"%s\""),
\r
96 rev,pPath->GetGitPathString());
\r
99 if(g_Git.Run(cmd,&output,CP_ACP))
\r
101 CMessageBox::Show(NULL,output,_T("TortoiseGit"),MB_OK|MB_ICONERROR);
\r
105 int oldstart = output.Find(_T("-Subproject commit"),start);
\r
108 CMessageBox::Show(NULL,_T("Subproject Diff Format error") ,_T("TortoiseGit"),MB_OK|MB_ICONERROR);
\r
111 oldhash = output.Mid(oldstart+ CString(_T("-Subproject commit")).GetLength()+1,40);
\r
113 int newstart = output.Find(_T("+Subproject commit"),start);
\r
116 CMessageBox::Show(NULL,_T("Subproject Diff Format error") ,_T("TortoiseGit"),MB_OK|MB_ICONERROR);
\r
119 newhash = output.Mid(newstart+ CString(_T("+Subproject commit")).GetLength()+1,40);
\r
123 cmd.Format(_T("git.exe diff-tree -r -z %s %s -- \"%s\""),
\r
124 rev2,rev1,pPath->GetGitPathString());
\r
127 if(g_Git.Run(cmd,&bytes))
\r
130 g_Git.StringAppend(&err,&bytes[0],CP_ACP);
\r
131 CMessageBox::Show(NULL,err,_T("TortoiseGit"),MB_OK|MB_ICONERROR);
\r
135 g_Git.StringAppend(&oldhash,&bytes[15],CP_ACP,40);
\r
136 g_Git.StringAppend(&newhash,&bytes[15+41],CP_ACP,40);
\r
144 subgit.m_CurrentDir=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();
\r
146 if(pPath->HasAdminDir())
\r
148 int encode=CAppUtils::GetLogOutputEncode(&subgit);
\r
150 if(oldhash != GIT_REV_ZERO)
\r
152 cmd.Format(_T("git log -n1 HEAD --pretty=format:\"%%s\" %s"),oldhash);
\r
153 subgit.Run(cmd,&oldsub,encode);
\r
155 if(newsub != GIT_REV_ZERO)
\r
157 cmd.Format(_T("git log -n1 HEAD --pretty=format:\"%%s\" %s"),newhash);
\r
158 subgit.Run(cmd,&newsub,encode);
\r
162 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
163 pPath->GetWinPath(),
\r
169 CMessageBox::Show(NULL,msg,_T("TortoiseGit"),MB_OK);
\r
174 int CGitDiff::Diff(CTGitPath * pPath,CTGitPath * pPath2, git_revnum_t & rev1, git_revnum_t & rev2, bool /*blame*/, bool /*unified*/)
\r
177 GetTempPath(temppath);
\r
184 if(pPath->IsDirectory() || pPath2->IsDirectory())
\r
186 return SubmoduleDiff(pPath,pPath2,rev1,rev2);
\r
189 if(rev1 != GIT_REV_ZERO )
\r
191 file1.Format(_T("%s%s_%s%s"),
\r
193 pPath->GetBaseFilename(),
\r
195 pPath->GetFileExtension());
\r
196 title1 = pPath->GetFileOrDirectoryName()+_T(":")+rev1.Left(6);
\r
197 cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev1,pPath->GetGitPathString());
\r
198 g_Git.RunLogFile(cmd,file1);
\r
201 file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();
\r
202 title1.Format( IDS_DIFF_WCNAME, pPath->GetFileOrDirectoryName() );
\r
207 if(rev2 != GIT_REV_ZERO)
\r
210 file2.Format(_T("%s%s_%s%s"),
\r
212 pPath2->GetBaseFilename(),
\r
214 pPath2->GetFileExtension());
\r
215 title2 = pPath2->GetFileOrDirectoryName()+_T(":")+rev2.Left(6);
\r
216 cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),rev2,pPath2->GetGitPathString());
\r
217 g_Git.RunLogFile(cmd,file2);
\r
220 file2=g_Git.m_CurrentDir+_T("\\")+pPath2->GetWinPathString();
\r
221 title2.Format( IDS_DIFF_WCNAME, pPath2->GetFileOrDirectoryName() );
\r
224 CAppUtils::DiffFlags flags;
\r
225 CAppUtils::StartExtDiff(file2,file1,
\r