OSDN Git Service

Use Rebase Dialog For cherry pick ant log dialog actions.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogListAction.cpp
1 // GitLogList.cpp : implementation file\r
2 //\r
3 /*\r
4         Description: qgit revision list view\r
5 \r
6         Author: Marco Costalba (C) 2005-2007\r
7 \r
8         Copyright: See COPYING file that comes with this distribution\r
9 \r
10 */\r
11 #include "stdafx.h"\r
12 #include "TortoiseProc.h"\r
13 #include "GitLogList.h"\r
14 #include "GitRev.h"\r
15 //#include "VssStyle.h"\r
16 #include "IconMenu.h"\r
17 // CGitLogList\r
18 #include "cursor.h"\r
19 #include "InputDlg.h"\r
20 #include "PropDlg.h"\r
21 #include "SVNProgressDlg.h"\r
22 #include "ProgressDlg.h"\r
23 //#include "RepositoryBrowser.h"\r
24 //#include "CopyDlg.h"\r
25 //#include "StatGraphDlg.h"\r
26 #include "Logdlg.h"\r
27 #include "MessageBox.h"\r
28 #include "Registry.h"\r
29 #include "AppUtils.h"\r
30 #include "PathUtils.h"\r
31 #include "StringUtils.h"\r
32 #include "UnicodeUtils.h"\r
33 #include "TempFile.h"\r
34 //#include "GitInfo.h"\r
35 //#include "GitDiff.h"\r
36 #include "IconMenu.h"\r
37 //#include "RevisionRangeDlg.h"\r
38 //#include "BrowseFolder.h"\r
39 //#include "BlameDlg.h"\r
40 //#include "Blame.h"\r
41 //#include "GitHelpers.h"\r
42 #include "GitStatus.h"\r
43 //#include "LogDlgHelper.h"\r
44 //#include "CachedLogInfo.h"\r
45 //#include "RepositoryInfo.h"\r
46 //#include "EditPropertiesDlg.h"\r
47 #include "FileDiffDlg.h"\r
48 #include "CommitDlg.h"\r
49 #include "RebaseDlg.h"\r
50 \r
51 IMPLEMENT_DYNAMIC(CGitLogList, CHintListCtrl)\r
52 \r
53 void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)\r
54 {       \r
55         POSITION pos = GetFirstSelectedItemPosition();\r
56         int indexNext = GetNextSelectedItem(pos);\r
57         if (indexNext < 0)\r
58                 return;\r
59 \r
60         GitRev* pSelLogEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(indexNext));\r
61 \r
62         theApp.DoWaitCursor(1);\r
63         bool bOpenWith = false;\r
64         switch (cmd)\r
65                 {\r
66                         case ID_GNUDIFF1:\r
67                         {\r
68                                 CString tempfile=GetTempFile();\r
69                                 CString cmd;\r
70                                 GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
71                                 cmd.Format(_T("git.exe diff-tree -r -p --stat %s"),r1->m_CommitHash);\r
72                                 g_Git.RunLogFile(cmd,tempfile);\r
73                                 CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r1->m_Subject);\r
74                         }\r
75                         break;\r
76 \r
77                         case ID_GNUDIFF2:\r
78                         {\r
79                                 CString tempfile=GetTempFile();\r
80                                 CString cmd;\r
81                                 GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
82                                 GitRev * r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
83                                 cmd.Format(_T("git.exe diff-tree -r -p --stat %s %s"),r1->m_CommitHash,r2->m_CommitHash);\r
84                                 g_Git.RunLogFile(cmd,tempfile);\r
85                                 CAppUtils::StartUnifiedDiffViewer(tempfile,r1->m_CommitHash.Left(6)+_T(":")+r2->m_CommitHash.Left(6));\r
86 \r
87                         }\r
88                         break;\r
89 \r
90                 case ID_COMPARETWO:\r
91                         {\r
92                                 GitRev * r1 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(FirstSelect));\r
93                                 GitRev * r2 = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
94                                 CFileDiffDlg dlg;\r
95                                 dlg.SetDiff(NULL,*r1,*r2);\r
96                                 dlg.DoModal();\r
97                                 \r
98                         }\r
99                         break;\r
100                 \r
101 \r
102                 case ID_COMPARE:\r
103                         {\r
104                                 GitRev * r1 = &m_wcRev;\r
105                                 GitRev * r2 = pSelLogEntry;\r
106                                 CFileDiffDlg dlg;\r
107                                 dlg.SetDiff(NULL,*r1,*r2);\r
108                                 dlg.DoModal();\r
109 \r
110                                 //user clicked on the menu item "compare with working copy"\r
111                                 //if (PromptShown())\r
112                                 //{\r
113                                 //      GitDiff diff(this, m_hWnd, true);\r
114                                 //      diff.SetAlternativeTool(!!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
115                                 //      diff.SetHEADPeg(m_LogRevision);\r
116                                 //      diff.ShowCompare(m_path, GitRev::REV_WC, m_path, revSelected);\r
117                                 //}\r
118                                 //else\r
119                                 //      CAppUtils::StartShowCompare(m_hWnd, m_path, GitRev::REV_WC, m_path, revSelected, GitRev(), m_LogRevision, !!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
120                         }\r
121                         break;\r
122 \r
123                 case ID_COMPAREWITHPREVIOUS:\r
124                         {\r
125 \r
126                                 CFileDiffDlg dlg;\r
127                                 \r
128                                 if(pSelLogEntry->m_ParentHash.size()>0)\r
129                                 //if(m_logEntries.m_HashMap[pSelLogEntry->m_ParentHash[0]]>=0)\r
130                                 {\r
131                                         dlg.SetDiff(NULL,pSelLogEntry->m_CommitHash,pSelLogEntry->m_ParentHash[0]);\r
132                                         dlg.DoModal();\r
133                                 }else\r
134                                 {\r
135                                         CMessageBox::Show(NULL,_T("No previous version"),_T("TortoiseGit"),MB_OK);      \r
136                                 }\r
137                                 //if (PromptShown())\r
138                                 //{\r
139                                 //      GitDiff diff(this, m_hWnd, true);\r
140                                 //      diff.SetAlternativeTool(!!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
141                                 //      diff.SetHEADPeg(m_LogRevision);\r
142                                 //      diff.ShowCompare(CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected);\r
143                                 //}\r
144                                 //else\r
145                                 //      CAppUtils::StartShowCompare(m_hWnd, CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected, GitRev(), m_LogRevision, !!(GetAsyncKeyState(VK_SHIFT) & 0x8000));\r
146                         }\r
147                         break;\r
148                 case ID_COPYCLIPBOARD:\r
149                         {\r
150                                 CopySelectionToClipBoard();\r
151                         }\r
152                         break;\r
153                 case ID_COPYHASH:\r
154                         {\r
155                                 CopySelectionToClipBoard(TRUE);\r
156                         }\r
157                         break;\r
158                 case ID_EXPORT:\r
159                         CAppUtils::Export(&pSelLogEntry->m_CommitHash);\r
160                         break;\r
161                 case ID_CREATE_BRANCH:\r
162                         CAppUtils::CreateBranchTag(FALSE,&pSelLogEntry->m_CommitHash);\r
163                         ReloadHashMap();\r
164                         Invalidate();                   \r
165                         break;\r
166                 case ID_CREATE_TAG:\r
167                         CAppUtils::CreateBranchTag(TRUE,&pSelLogEntry->m_CommitHash);\r
168                         ReloadHashMap();\r
169                         Invalidate();\r
170                         break;\r
171                 case ID_SWITCHTOREV:\r
172                         CAppUtils::Switch(&pSelLogEntry->m_CommitHash);\r
173                         ReloadHashMap();\r
174                         Invalidate();\r
175                         break;\r
176                 case ID_RESET:\r
177                         CAppUtils::GitReset(&pSelLogEntry->m_CommitHash);\r
178                         ReloadHashMap();\r
179                         Invalidate();\r
180                         break;\r
181                 case ID_REBASE_PICK:\r
182                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_PICK);\r
183                         break;\r
184                 case ID_REBASE_EDIT:\r
185                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_EDIT);\r
186                         break;\r
187                 case ID_REBASE_SQUASH:\r
188                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_SQUASH);\r
189                         break;\r
190                 case ID_REBASE_SKIP:\r
191                         SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_SKIP);\r
192                         break;\r
193                 case ID_COMBINE_COMMIT:\r
194                 {\r
195                         CString head;\r
196                         CString headhash;\r
197                         \r
198                         head.Format(_T("HEAD~%d"),LastSelect);\r
199                         CString hash=g_Git.GetHash(head);\r
200                         hash=hash.Left(40);\r
201                         \r
202                         headhash=g_Git.GetHash(CString(_T("HEAD")));\r
203                         headhash=headhash.Left(40);                     \r
204                         \r
205                         GitRev* pLastEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
206                         if(pLastEntry->m_CommitHash != hash)\r
207                         {\r
208                                 CMessageBox::Show(NULL,_T("Only combine top continuous commit"),_T("TortoiseGit"),MB_OK);\r
209                         }\r
210                         if(!g_Git.CheckCleanWorkTree())\r
211                         {\r
212                                 CMessageBox::Show(NULL,_T("Combine need clean work tree"),_T("TortoiseGit"),MB_OK);\r
213                                 break;\r
214                         }\r
215                         CString cmd,out;\r
216 \r
217                         cmd.Format(_T("git.exe reset --mixed  %s"),hash);\r
218                         if(g_Git.Run(cmd,&out,CP_UTF8))\r
219                         {\r
220                                 CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
221                         }\r
222                         CCommitDlg dlg;\r
223                         for(int i=FirstSelect;i<=LastSelect;i++)\r
224                         {\r
225                                 GitRev* pRev = reinterpret_cast<GitRev*>(m_arShownList.GetAt(i));\r
226                                 dlg.m_sLogMessage+=pRev->m_Subject+_T("\n")+pRev->m_Body;\r
227                                 dlg.m_sLogMessage+=_T("\n");\r
228                         }\r
229                         dlg.m_bWholeProject=true;\r
230                         dlg.m_bSelectFilesForCommit = true;\r
231                         dlg.m_bCommitAmend=true;\r
232                         dlg.m_AmendStr=dlg.m_sLogMessage;\r
233 \r
234                         if (dlg.DoModal() == IDOK)\r
235                         {\r
236                                                                         \r
237                         }else\r
238                         {\r
239                                 cmd.Format(_T("git.exe reset --hard  %s"),headhash);\r
240                                 out.Empty();\r
241                                 if(g_Git.Run(cmd,&out,CP_UTF8))\r
242                                 {\r
243                                         CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
244                                 }\r
245                         }\r
246                         Refresh();\r
247                 }\r
248                         break;\r
249 \r
250                 case ID_CHERRY_PICK:\r
251                         if(!g_Git.CheckCleanWorkTree())\r
252                         {\r
253                                 CMessageBox::Show(NULL,_T("Cherry Pick Require Clean Working Tree"),_T("TortoiseGit"),MB_OK);\r
254                         \r
255                         }else\r
256                         {\r
257                                 CRebaseDlg dlg;\r
258                                 dlg.m_IsCherryPick = TRUE;\r
259                                 dlg.m_Upstream = this->m_CurrentBranch;\r
260                                 POSITION pos = GetFirstSelectedItemPosition();\r
261                                 while(pos)\r
262                                 {\r
263                                         int indexNext = GetNextSelectedItem(pos);\r
264                                         dlg.m_CommitList.m_logEntries.push_back(*(GitRev*)m_arShownList[indexNext]);\r
265                                         dlg.m_CommitList.m_logEntries.at(dlg.m_CommitList.m_logEntries.size()-1).m_Action |= CTGitPath::LOGACTIONS_REBASE_PICK;\r
266                                 }\r
267 \r
268                                 if(dlg.DoModal() == IDOK)\r
269                                 {\r
270                                         Refresh();\r
271                                 }\r
272                         }\r
273                         break;\r
274                 case ID_REBASE_TO_VERSION:\r
275                         if(!g_Git.CheckCleanWorkTree())\r
276                         {\r
277                                 CMessageBox::Show(NULL,_T("Rebase Require Clean Working Tree"),_T("TortoiseGit"),MB_OK);\r
278                         \r
279                         }else\r
280                         {\r
281                                 CRebaseDlg dlg;\r
282                                 dlg.m_Upstream = pSelLogEntry->m_CommitHash;\r
283 \r
284                                 if(dlg.DoModal() == IDOK)\r
285                                 {\r
286                                         Refresh();\r
287                                 }\r
288                         }\r
289 \r
290                         break;\r
291 \r
292                 default:\r
293                         //CMessageBox::Show(NULL,_T("Have not implemented"),_T("TortoiseGit"),MB_OK);\r
294                         break;\r
295 #if 0\r
296         \r
297                 case ID_REVERTREV:\r
298                         {\r
299                                 // we need an URL to complete this command, so error out if we can't get an URL\r
300                                 if (pathURL.IsEmpty())\r
301                                 {\r
302                                         CString strMessage;\r
303                                         strMessage.Format(IDS_ERR_NOURLOFFILE, (LPCTSTR)(m_path.GetUIPathString()));\r
304                                         CMessageBox::Show(this->m_hWnd, strMessage, _T("TortoiseGit"), MB_ICONERROR);\r
305                                         TRACE(_T("could not retrieve the URL of the folder!\n"));\r
306                                         break;          //exit\r
307                                 }\r
308                                 CString msg;\r
309                                 msg.Format(IDS_LOG_REVERT_CONFIRM, m_path.GetWinPath());\r
310                                 if (CMessageBox::Show(this->m_hWnd, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION) == IDYES)\r
311                                 {\r
312                                         CGitProgressDlg dlg;\r
313                                         dlg.SetCommand(CGitProgressDlg::GitProgress_Merge);\r
314                                         dlg.SetPathList(CTGitPathList(m_path));\r
315                                         dlg.SetUrl(pathURL);\r
316                                         dlg.SetSecondUrl(pathURL);\r
317                                         revisionRanges.AdjustForMerge(true);\r
318                                         dlg.SetRevisionRanges(revisionRanges);\r
319                                         dlg.SetPegRevision(m_LogRevision);\r
320                                         dlg.DoModal();\r
321                                 }\r
322                         }\r
323                         break;\r
324                 case ID_MERGEREV:\r
325                         {\r
326                                 // we need an URL to complete this command, so error out if we can't get an URL\r
327                                 if (pathURL.IsEmpty())\r
328                                 {\r
329                                         CString strMessage;\r
330                                         strMessage.Format(IDS_ERR_NOURLOFFILE, (LPCTSTR)(m_path.GetUIPathString()));\r
331                                         CMessageBox::Show(this->m_hWnd, strMessage, _T("TortoiseGit"), MB_ICONERROR);\r
332                                         TRACE(_T("could not retrieve the URL of the folder!\n"));\r
333                                         break;          //exit\r
334                                 }\r
335 \r
336                                 CString path = m_path.GetWinPathString();\r
337                                 bool bGotSavePath = false;\r
338                                 if ((GetSelectedCount() == 1)&&(!m_path.IsDirectory()))\r
339                                 {\r
340                                         bGotSavePath = CAppUtils::FileOpenSave(path, NULL, IDS_LOG_MERGETO, IDS_COMMONFILEFILTER, true, GetSafeHwnd());\r
341                                 }\r
342                                 else\r
343                                 {\r
344                                         CBrowseFolder folderBrowser;\r
345                                         folderBrowser.SetInfo(CString(MAKEINTRESOURCE(IDS_LOG_MERGETO)));\r
346                                         bGotSavePath = (folderBrowser.Show(GetSafeHwnd(), path, path) == CBrowseFolder::OK);\r
347                                 }\r
348                                 if (bGotSavePath)\r
349                                 {\r
350                                         CGitProgressDlg dlg;\r
351                                         dlg.SetCommand(CGitProgressDlg::GitProgress_Merge);\r
352                                         dlg.SetPathList(CTGitPathList(CTGitPath(path)));\r
353                                         dlg.SetUrl(pathURL);\r
354                                         dlg.SetSecondUrl(pathURL);\r
355                                         revisionRanges.AdjustForMerge(false);\r
356                                         dlg.SetRevisionRanges(revisionRanges);\r
357                                         dlg.SetPegRevision(m_LogRevision);\r
358                                         dlg.DoModal();\r
359                                 }\r
360                         }\r
361                         break;\r
362                 case ID_REVERTTOREV:\r
363                         {\r
364                                 // we need an URL to complete this command, so error out if we can't get an URL\r
365                                 if (pathURL.IsEmpty())\r
366                                 {\r
367                                         CString strMessage;\r
368                                         strMessage.Format(IDS_ERR_NOURLOFFILE, (LPCTSTR)(m_path.GetUIPathString()));\r
369                                         CMessageBox::Show(this->m_hWnd, strMessage, _T("TortoiseGit"), MB_ICONERROR);\r
370                                         TRACE(_T("could not retrieve the URL of the folder!\n"));\r
371                                         break;          //exit\r
372                                 }\r
373 \r
374                                 CString msg;\r
375                                 msg.Format(IDS_LOG_REVERTTOREV_CONFIRM, m_path.GetWinPath());\r
376                                 if (CMessageBox::Show(this->m_hWnd, msg, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION) == IDYES)\r
377                                 {\r
378                                         CGitProgressDlg dlg;\r
379                                         dlg.SetCommand(CGitProgressDlg::GitProgress_Merge);\r
380                                         dlg.SetPathList(CTGitPathList(m_path));\r
381                                         dlg.SetUrl(pathURL);\r
382                                         dlg.SetSecondUrl(pathURL);\r
383                                         GitRevRangeArray revarray;\r
384                                         revarray.AddRevRange(GitRev::REV_HEAD, revSelected);\r
385                                         dlg.SetRevisionRanges(revarray);\r
386                                         dlg.SetPegRevision(m_LogRevision);\r
387                                         dlg.DoModal();\r
388                                 }\r
389                         }\r
390                         break;\r
391         \r
392 \r
393         \r
394                 case ID_BLAMECOMPARE:\r
395                         {\r
396                                 //user clicked on the menu item "compare with working copy"\r
397                                 //now first get the revision which is selected\r
398                                 if (PromptShown())\r
399                                 {\r
400                                         GitDiff diff(this, this->m_hWnd, true);\r
401                                         diff.SetHEADPeg(m_LogRevision);\r
402                                         diff.ShowCompare(m_path, GitRev::REV_BASE, m_path, revSelected, GitRev(), false, true);\r
403                                 }\r
404                                 else\r
405                                         CAppUtils::StartShowCompare(m_hWnd, m_path, GitRev::REV_BASE, m_path, revSelected, GitRev(), m_LogRevision, false, false, true);\r
406                         }\r
407                         break;\r
408                 case ID_BLAMETWO:\r
409                         {\r
410                                 //user clicked on the menu item "compare and blame revisions"\r
411                                 if (PromptShown())\r
412                                 {\r
413                                         GitDiff diff(this, this->m_hWnd, true);\r
414                                         diff.SetHEADPeg(m_LogRevision);\r
415                                         diff.ShowCompare(CTGitPath(pathURL), revSelected2, CTGitPath(pathURL), revSelected, GitRev(), false, true);\r
416                                 }\r
417                                 else\r
418                                         CAppUtils::StartShowCompare(m_hWnd, CTGitPath(pathURL), revSelected2, CTGitPath(pathURL), revSelected, GitRev(), m_LogRevision, false, false, true);\r
419                         }\r
420                         break;\r
421                 case ID_BLAMEWITHPREVIOUS:\r
422                         {\r
423                                 //user clicked on the menu item "Compare and Blame with previous revision"\r
424                                 if (PromptShown())\r
425                                 {\r
426                                         GitDiff diff(this, this->m_hWnd, true);\r
427                                         diff.SetHEADPeg(m_LogRevision);\r
428                                         diff.ShowCompare(CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected, GitRev(), false, true);\r
429                                 }\r
430                                 else\r
431                                         CAppUtils::StartShowCompare(m_hWnd, CTGitPath(pathURL), revPrevious, CTGitPath(pathURL), revSelected, GitRev(), m_LogRevision, false, false, true);\r
432                         }\r
433                         break;\r
434                 \r
435                 case ID_OPENWITH:\r
436                         bOpenWith = true;\r
437                 case ID_OPEN:\r
438                         {\r
439                                 CProgressDlg progDlg;\r
440                                 progDlg.SetTitle(IDS_APPNAME);\r
441                                 progDlg.SetAnimation(IDR_DOWNLOAD);\r
442                                 CString sInfoLine;\r
443                                 sInfoLine.Format(IDS_PROGRESSGETFILEREVISION, m_path.GetWinPath(), (LPCTSTR)revSelected.ToString());\r
444                                 progDlg.SetLine(1, sInfoLine, true);\r
445                                 SetAndClearProgressInfo(&progDlg);\r
446                                 progDlg.ShowModeless(m_hWnd);\r
447                                 CTGitPath tempfile = CTempFiles::Instance().GetTempFilePath(false, m_path, revSelected);\r
448                                 bool bSuccess = true;\r
449                                 if (!Cat(m_path, GitRev(GitRev::REV_HEAD), revSelected, tempfile))\r
450                                 {\r
451                                         bSuccess = false;\r
452                                         // try again, but with the selected revision as the peg revision\r
453                                         if (!Cat(m_path, revSelected, revSelected, tempfile))\r
454                                         {\r
455                                                 progDlg.Stop();\r
456                                                 SetAndClearProgressInfo((HWND)NULL);\r
457                                                 CMessageBox::Show(this->m_hWnd, GetLastErrorMessage(), _T("TortoiseGit"), MB_ICONERROR);\r
458                                                 EnableOKButton();\r
459                                                 break;\r
460                                         }\r
461                                         bSuccess = true;\r
462                                 }\r
463                                 if (bSuccess)\r
464                                 {\r
465                                         progDlg.Stop();\r
466                                         SetAndClearProgressInfo((HWND)NULL);\r
467                                         SetFileAttributes(tempfile.GetWinPath(), FILE_ATTRIBUTE_READONLY);\r
468                                         int ret = 0;\r
469                                         if (!bOpenWith)\r
470                                                 ret = (int)ShellExecute(this->m_hWnd, NULL, tempfile.GetWinPath(), NULL, NULL, SW_SHOWNORMAL);\r
471                                         if ((ret <= HINSTANCE_ERROR)||bOpenWith)\r
472                                         {\r
473                                                 CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
474                                                 cmd += tempfile.GetWinPathString() + _T(" ");\r
475                                                 CAppUtils::LaunchApplication(cmd, NULL, false);\r
476                                         }\r
477                                 }\r
478                         }\r
479                         break;\r
480                 case ID_BLAME:\r
481                         {\r
482                                 CBlameDlg dlg;\r
483                                 dlg.EndRev = revSelected;\r
484                                 if (dlg.DoModal() == IDOK)\r
485                                 {\r
486                                         CBlame blame;\r
487                                         CString tempfile;\r
488                                         CString logfile;\r
489                                         tempfile = blame.BlameToTempFile(m_path, dlg.StartRev, dlg.EndRev, dlg.EndRev, logfile, _T(""), dlg.m_bIncludeMerge, TRUE, TRUE);\r
490                                         if (!tempfile.IsEmpty())\r
491                                         {\r
492                                                 if (dlg.m_bTextView)\r
493                                                 {\r
494                                                         //open the default text editor for the result file\r
495                                                         CAppUtils::StartTextViewer(tempfile);\r
496                                                 }\r
497                                                 else\r
498                                                 {\r
499                                                         CString sParams = _T("/path:\"") + m_path.GetGitPathString() + _T("\" ");\r
500                                                         if(!CAppUtils::LaunchTortoiseBlame(tempfile, logfile, CPathUtils::GetFileNameFromPath(m_path.GetFileOrDirectoryName()),sParams))\r
501                                                         {\r
502                                                                 break;\r
503                                                         }\r
504                                                 }\r
505                                         }\r
506                                         else\r
507                                         {\r
508                                                 CMessageBox::Show(this->m_hWnd, blame.GetLastErrorMessage(), _T("TortoiseGit"), MB_ICONERROR);\r
509                                         }\r
510                                 }\r
511                         }\r
512                         break;\r
513                 case ID_UPDATE:\r
514                         {\r
515                                 CString sCmd;\r
516                                 CString url = _T("tgit:")+pathURL;\r
517                                 sCmd.Format(_T("%s /command:update /path:\"%s\" /rev:%ld"),\r
518                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
519                                         (LPCTSTR)m_path.GetWinPath(), (LONG)revSelected);\r
520                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
521                         }\r
522                         break;\r
523                 case ID_FINDENTRY:\r
524                         {\r
525                                 m_nSearchIndex = GetSelectionMark();\r
526                                 if (m_nSearchIndex < 0)\r
527                                         m_nSearchIndex = 0;\r
528                                 if (m_pFindDialog)\r
529                                 {\r
530                                         break;\r
531                                 }\r
532                                 else\r
533                                 {\r
534                                         m_pFindDialog = new CFindReplaceDialog();\r
535                                         m_pFindDialog->Create(TRUE, NULL, NULL, FR_HIDEUPDOWN | FR_HIDEWHOLEWORD, this);                                                                        \r
536                                 }\r
537                         }\r
538                         break;\r
539                 case ID_REPOBROWSE:\r
540                         {\r
541                                 CString sCmd;\r
542                                 sCmd.Format(_T("%s /command:repobrowser /path:\"%s\" /rev:%s"),\r
543                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
544                                         (LPCTSTR)pathURL, (LPCTSTR)revSelected.ToString());\r
545 \r
546                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
547                         }\r
548                         break;\r
549                 case ID_EDITLOG:\r
550                         {\r
551                                 EditLogMessage(selIndex);\r
552                         }\r
553                         break;\r
554                 case ID_EDITAUTHOR:\r
555                         {\r
556                                 EditAuthor(selEntries);\r
557                         }\r
558                         break;\r
559                 case ID_REVPROPS:\r
560                         {\r
561                                 CEditPropertiesDlg dlg;\r
562                                 dlg.SetProjectProperties(&m_ProjectProperties);\r
563                                 CTGitPathList escapedlist;\r
564                                 dlg.SetPathList(CTGitPathList(CTGitPath(pathURL)));\r
565                                 dlg.SetRevision(revSelected);\r
566                                 dlg.RevProps(true);\r
567                                 dlg.DoModal();\r
568                         }\r
569                         break;\r
570                 \r
571                 case ID_EXPORT:\r
572                         {\r
573                                 CString sCmd;\r
574                                 sCmd.Format(_T("%s /command:export /path:\"%s\" /revision:%ld"),\r
575                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
576                                         (LPCTSTR)pathURL, (LONG)revSelected);\r
577                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
578                         }\r
579                         break;\r
580                 case ID_CHECKOUT:\r
581                         {\r
582                                 CString sCmd;\r
583                                 CString url = _T("tgit:")+pathURL;\r
584                                 sCmd.Format(_T("%s /command:checkout /url:\"%s\" /revision:%ld"),\r
585                                         (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("TortoiseProc.exe")),\r
586                                         (LPCTSTR)url, (LONG)revSelected);\r
587                                 CAppUtils::LaunchApplication(sCmd, NULL, false);\r
588                         }\r
589                         break;\r
590                 case ID_VIEWREV:\r
591                         {\r
592                                 CString url = m_ProjectProperties.sWebViewerRev;\r
593                                 url = GetAbsoluteUrlFromRelativeUrl(url);\r
594                                 url.Replace(_T("%REVISION%"), revSelected.ToString());\r
595                                 if (!url.IsEmpty())\r
596                                         ShellExecute(this->m_hWnd, _T("open"), url, NULL, NULL, SW_SHOWDEFAULT);                                        \r
597                         }\r
598                         break;\r
599                 case ID_VIEWPATHREV:\r
600                         {\r
601                                 CString relurl = pathURL;\r
602                                 CString sRoot = GetRepositoryRoot(CTGitPath(relurl));\r
603                                 relurl = relurl.Mid(sRoot.GetLength());\r
604                                 CString url = m_ProjectProperties.sWebViewerPathRev;\r
605                                 url = GetAbsoluteUrlFromRelativeUrl(url);\r
606                                 url.Replace(_T("%REVISION%"), revSelected.ToString());\r
607                                 url.Replace(_T("%PATH%"), relurl);\r
608                                 if (!url.IsEmpty())\r
609                                         ShellExecute(this->m_hWnd, _T("open"), url, NULL, NULL, SW_SHOWDEFAULT);                                        \r
610                         }\r
611                         break;\r
612 #endif\r
613                 \r
614                 } // switch (cmd)\r
615 \r
616                 theApp.DoWaitCursor(-1);\r
617 }\r
618 \r
619 void CGitLogList::SetSelectedAction(int action)\r
620 {\r
621         POSITION pos = GetFirstSelectedItemPosition();\r
622         int index;\r
623         while(pos)\r
624         {\r
625                 index = GetNextSelectedItem(pos);\r
626                 ((GitRev*)m_arShownList[index])->m_Action = action;\r
627                 CRect rect;\r
628                 this->GetItemRect(index,&rect,LVIR_BOUNDS);\r
629                 this->InvalidateRect(rect);\r
630 \r
631         }\r
632 \r
633 }