OSDN Git Service

Show nothing rebase when local branch equal upstream at rebasedlg
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitDiff.cpp
1 #include "StdAfx.h"\r
2 #include "GitDiff.h"\r
3 #include "AppUtils.h"\r
4 #include "git.h"\r
5 #include "gittype.h"\r
6 #include "resource.h"\r
7 #include "MessageBox.h"\r
8 \r
9 CGitDiff::CGitDiff(void)\r
10 {\r
11 }\r
12 \r
13 CGitDiff::~CGitDiff(void)\r
14 {\r
15 }\r
16 int CGitDiff::Parser(git_revnum_t &rev)\r
17 {\r
18         if(rev == GIT_REV_ZERO)\r
19                 return 0;\r
20         if(rev.GetLength() > 40)\r
21         {\r
22                 CString cmd;\r
23                 cmd.Format(_T("git.exe rev-parse %s"),rev);\r
24                 CString output;\r
25                 if(!g_Git.Run(cmd,&output,CP_UTF8))\r
26                 {\r
27                         //int start=output.Find(_T('\n'));\r
28                         rev=output.Left(40);\r
29                 }\r
30         }\r
31         return 0;\r
32 }\r
33 int CGitDiff::DiffNull(CTGitPath *pPath, git_revnum_t &rev1,bool bIsAdd)\r
34 {\r
35         CString temppath;\r
36         GetTempPath(temppath);\r
37         Parser(rev1);\r
38         CString file1;\r
39         CString nullfile;\r
40         CString cmd;\r
41         if(rev1 != GIT_REV_ZERO )\r
42         {\r
43                 file1.Format(_T("%s%s_%s%s"),\r
44                                 temppath,                                               \r
45                                 pPath->GetBaseFilename(),\r
46                                 rev1.Left(6),\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
50         }else\r
51         {\r
52                 file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();\r
53         }\r
54 \r
55         CString tempfile=::GetTempFile();\r
56         CStdioFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate );\r
57         //file.WriteString();\r
58         file.Close();\r
59         \r
60         CAppUtils::DiffFlags flags;\r
61 \r
62         if(bIsAdd)\r
63                 CAppUtils::StartExtDiff(tempfile,file1,\r
64                                                         _T("NULL"),\r
65                                                         pPath->GetGitPathString()+_T(":")+rev1.Left(6)\r
66                                                         ,flags);\r
67         else\r
68                 CAppUtils::StartExtDiff(file1,tempfile,\r
69                                                         pPath->GetGitPathString()+_T(":")+rev1.Left(6)\r
70                                                         ,_T("NULL"),flags);\r
71 \r
72         return 0;\r
73 }\r
74 \r
75 int CGitDiff::SubmoduleDiff(CTGitPath * pPath,CTGitPath * pPath2, git_revnum_t & rev1, git_revnum_t & rev2, bool /*blame*/, bool /*unified*/)\r
76 {\r
77         CString oldhash;\r
78         CString newhash;\r
79         CString cmd,err;\r
80         CString workingcopy;\r
81 \r
82         if( rev2 == GIT_REV_ZERO || rev1 == GIT_REV_ZERO )\r
83         {\r
84                 oldhash = GIT_REV_ZERO;\r
85                 newhash = GIT_REV_ZERO;\r
86 \r
87                 CString rev;\r
88                 if( rev2 != GIT_REV_ZERO )\r
89                         rev = rev2;\r
90                 if( rev1 != GIT_REV_ZERO )\r
91                         rev = rev1;\r
92                 \r
93                 workingcopy = _T("(Work Copy)");\r
94 \r
95                 cmd.Format(_T("git.exe diff %s -- \"%s\""),\r
96                 rev,pPath->GetGitPathString());\r
97 \r
98                 CString output;\r
99                 if(g_Git.Run(cmd,&output,CP_ACP))\r
100                 {\r
101                         CMessageBox::Show(NULL,output,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
102                         return -1;\r
103                 }\r
104                 int start =0;\r
105                 int oldstart = output.Find(_T("-Subproject commit"),start);\r
106                 if(oldstart<0)\r
107                 {\r
108                         CMessageBox::Show(NULL,_T("Subproject Diff Format error") ,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
109                         return -1;\r
110                 }\r
111                 oldhash = output.Mid(oldstart+ CString(_T("-Subproject commit")).GetLength()+1,40);\r
112                 start = 0;\r
113                 int newstart = output.Find(_T("+Subproject commit"),start);\r
114                 if(oldstart<0)\r
115                 {\r
116                         CMessageBox::Show(NULL,_T("Subproject Diff Format error") ,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
117                         return -1;\r
118                 }\r
119                 newhash = output.Mid(newstart+ CString(_T("+Subproject commit")).GetLength()+1,40);\r
120                 \r
121         }else\r
122         {\r
123                 cmd.Format(_T("git.exe diff-tree -r -z %s %s -- \"%s\""),\r
124                 rev2,rev1,pPath->GetGitPathString());\r
125                 \r
126                 BYTE_VECTOR bytes;\r
127                 if(g_Git.Run(cmd,&bytes))\r
128                 {\r
129                         CString err;\r
130                         g_Git.StringAppend(&err,&bytes[0],CP_ACP);\r
131                         CMessageBox::Show(NULL,err,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
132                         return -1;\r
133                 }\r
134 \r
135                 g_Git.StringAppend(&oldhash,&bytes[15],CP_ACP,40);\r
136                 g_Git.StringAppend(&newhash,&bytes[15+41],CP_ACP,40);\r
137                 \r
138         }\r
139                 \r
140         CString oldsub;\r
141         CString newsub;\r
142 \r
143         CGit subgit; \r
144         subgit.m_CurrentDir=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();\r
145 \r
146         if(pPath->HasAdminDir())\r
147         {\r
148                 int encode=CAppUtils::GetLogOutputEncode(&subgit);\r
149 \r
150                 if(oldhash != GIT_REV_ZERO)\r
151                 {\r
152                         cmd.Format(_T("git log -n1 HEAD --pretty=format:\"%%s\" %s"),oldhash);\r
153                         subgit.Run(cmd,&oldsub,encode);\r
154                 }\r
155                 if(newsub != GIT_REV_ZERO)\r
156                 {\r
157                         cmd.Format(_T("git log -n1 HEAD --pretty=format:\"%%s\" %s"),newhash);\r
158                         subgit.Run(cmd,&newsub,encode);\r
159                 }\r
160         }\r
161         CString msg;\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
164                            oldhash,\r
165                            oldsub ,\r
166                            workingcopy,\r
167                            newhash,\r
168                            newsub);\r
169         CMessageBox::Show(NULL,msg,_T("TortoiseGit"),MB_OK);\r
170 \r
171         return 0;\r
172 }\r
173 \r
174 int CGitDiff::Diff(CTGitPath * pPath,CTGitPath * pPath2, git_revnum_t & rev1, git_revnum_t & rev2, bool /*blame*/, bool /*unified*/)\r
175 {\r
176         CString temppath;\r
177         GetTempPath(temppath);\r
178         Parser(rev1);\r
179         Parser(rev2);\r
180         CString file1;\r
181         CString title1;\r
182         CString cmd;\r
183 \r
184         if(pPath->IsDirectory() || pPath2->IsDirectory())\r
185         {\r
186                 return SubmoduleDiff(pPath,pPath2,rev1,rev2);\r
187         }\r
188 \r
189         if(rev1 != GIT_REV_ZERO )\r
190         {\r
191                 file1.Format(_T("%s%s_%s%s"),\r
192                                 temppath,                                               \r
193                                 pPath->GetBaseFilename(),\r
194                                 rev1.Left(6),\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
199         }else\r
200         {\r
201                 file1=g_Git.m_CurrentDir+_T("\\")+pPath->GetWinPathString();\r
202                 title1.Format( IDS_DIFF_WCNAME, pPath->GetFileOrDirectoryName() );\r
203         }\r
204 \r
205         CString file2;\r
206         CString title2;\r
207         if(rev2 != GIT_REV_ZERO)\r
208         {\r
209                 \r
210                 file2.Format(_T("%s%s_%s%s"),\r
211                                 temppath,                                               \r
212                                 pPath2->GetBaseFilename(),\r
213                                 rev2.Left(6),\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
218         }else\r
219         {\r
220                 file2=g_Git.m_CurrentDir+_T("\\")+pPath2->GetWinPathString();\r
221                 title2.Format( IDS_DIFF_WCNAME, pPath2->GetFileOrDirectoryName() );\r
222         }\r
223         \r
224         CAppUtils::DiffFlags flags;\r
225         CAppUtils::StartExtDiff(file2,file1,\r
226                                                         title2,\r
227                                                         title1\r
228                                                         ,flags);\r
229 \r
230         return 0;\r
231 }\r
232 \r