OSDN Git Service

Add Combine Commit to one commit at log list dialog
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / GitLogListAction.cpp
index 0b3d003..86bd2cc 100644 (file)
@@ -45,6 +45,7 @@
 //#include "RepositoryInfo.h"\r
 //#include "EditPropertiesDlg.h"\r
 #include "FileDiffDlg.h"\r
+#include "CommitDlg.h"\r
 \r
 IMPLEMENT_DYNAMIC(CGitLogList, CHintListCtrl)\r
 \r
@@ -188,6 +189,62 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                case ID_REBASE_SKIP:\r
                        SetSelectedAction(CTGitPath::LOGACTIONS_REBASE_SKIP);\r
                        break;\r
+               case ID_COMBINE_COMMIT:\r
+               {\r
+                       CString head;\r
+                       CString headhash;\r
+                       \r
+                       head.Format(_T("HEAD~%d"),LastSelect);\r
+                       CString hash=g_Git.GetHash(head);\r
+                       hash=hash.Left(40);\r
+                       \r
+                       headhash=g_Git.GetHash(CString(_T("HEAD")));\r
+                       headhash=headhash.Left(40);                     \r
+                       \r
+                       GitRev* pLastEntry = reinterpret_cast<GitRev*>(m_arShownList.GetAt(LastSelect));\r
+                       if(pLastEntry->m_CommitHash != hash)\r
+                       {\r
+                               CMessageBox::Show(NULL,_T("Only combine top continuous commit"),_T("TortoiseGit"),MB_OK);\r
+                       }\r
+                       if(!g_Git.CheckCleanWorkTree())\r
+                       {\r
+                               CMessageBox::Show(NULL,_T("Combine need clean work tree"),_T("TortoiseGit"),MB_OK);\r
+                               break;\r
+                       }\r
+                       CString cmd,out;\r
+\r
+                       cmd.Format(_T("git.exe reset --mixed  %s"),hash);\r
+                       if(g_Git.Run(cmd,&out,CP_UTF8))\r
+                       {\r
+                               CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+                       }\r
+                       CCommitDlg dlg;\r
+                       for(int i=FirstSelect;i<=LastSelect;i++)\r
+                       {\r
+                               GitRev* pRev = reinterpret_cast<GitRev*>(m_arShownList.GetAt(i));\r
+                               dlg.m_sLogMessage+=pRev->m_Subject+_T("\n")+pRev->m_Body;\r
+                               dlg.m_sLogMessage+=_T("\n");\r
+                       }\r
+                       dlg.m_bWholeProject=true;\r
+                       dlg.m_bSelectFilesForCommit = true;\r
+                       dlg.m_bCommitAmend=true;\r
+                       dlg.m_AmendStr=dlg.m_sLogMessage;\r
+\r
+                       if (dlg.DoModal() == IDOK)\r
+                       {\r
+                                                                       \r
+                       }else\r
+                       {\r
+                               cmd.Format(_T("git.exe reset --hard  %s"),headhash);\r
+                               out.Empty();\r
+                               if(g_Git.Run(cmd,&out,CP_UTF8))\r
+                               {\r
+                                       CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+                               }\r
+                       }\r
+                       Refresh();\r
+               }\r
+                       break;\r
                default:\r
                        //CMessageBox::Show(NULL,_T("Have not implemented"),_T("TortoiseGit"),MB_OK);\r
                        break;\r