OSDN Git Service

Use Rebase Dialog For cherry pick ant log dialog actions.
authorFrank Li <lznuaa@gmail.com>
Sat, 21 Feb 2009 09:09:33 +0000 (17:09 +0800)
committerFrank Li <lznuaa@gmail.com>
Sat, 21 Feb 2009 09:09:33 +0000 (17:09 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/TortoiseProc/Commands/RebaseCommand.cpp
src/TortoiseProc/GitLogListAction.cpp
src/TortoiseProc/RebaseDlg.cpp
src/TortoiseProc/RebaseDlg.h

index d517af1..c7df2ae 100644 (file)
 bool RebaseCommand::Execute()\r
 {\r
        bool bRet =false;\r
+       \r
+       if(!g_Git.CheckCleanWorkTree())\r
+       {\r
+               CMessageBox::Show(NULL,_T("Rebase Require Clean Working Tree"),_T("TortoiseGit"),MB_OK);\r
+               return false;           \r
+       }\r
+\r
        CRebaseDlg dlg;\r
        if(dlg.DoModal() == IDOK)\r
        {\r
index 86bd2cc..8bafa70 100644 (file)
@@ -46,6 +46,7 @@
 //#include "EditPropertiesDlg.h"\r
 #include "FileDiffDlg.h"\r
 #include "CommitDlg.h"\r
+#include "RebaseDlg.h"\r
 \r
 IMPLEMENT_DYNAMIC(CGitLogList, CHintListCtrl)\r
 \r
@@ -245,6 +246,49 @@ void CGitLogList::ContextMenuAction(int cmd,int FirstSelect, int LastSelect)
                        Refresh();\r
                }\r
                        break;\r
+\r
+               case ID_CHERRY_PICK:\r
+                       if(!g_Git.CheckCleanWorkTree())\r
+                       {\r
+                               CMessageBox::Show(NULL,_T("Cherry Pick Require Clean Working Tree"),_T("TortoiseGit"),MB_OK);\r
+                       \r
+                       }else\r
+                       {\r
+                               CRebaseDlg dlg;\r
+                               dlg.m_IsCherryPick = TRUE;\r
+                               dlg.m_Upstream = this->m_CurrentBranch;\r
+                               POSITION pos = GetFirstSelectedItemPosition();\r
+                               while(pos)\r
+                               {\r
+                                       int indexNext = GetNextSelectedItem(pos);\r
+                                       dlg.m_CommitList.m_logEntries.push_back(*(GitRev*)m_arShownList[indexNext]);\r
+                                       dlg.m_CommitList.m_logEntries.at(dlg.m_CommitList.m_logEntries.size()-1).m_Action |= CTGitPath::LOGACTIONS_REBASE_PICK;\r
+                               }\r
+\r
+                               if(dlg.DoModal() == IDOK)\r
+                               {\r
+                                       Refresh();\r
+                               }\r
+                       }\r
+                       break;\r
+               case ID_REBASE_TO_VERSION:\r
+                       if(!g_Git.CheckCleanWorkTree())\r
+                       {\r
+                               CMessageBox::Show(NULL,_T("Rebase Require Clean Working Tree"),_T("TortoiseGit"),MB_OK);\r
+                       \r
+                       }else\r
+                       {\r
+                               CRebaseDlg dlg;\r
+                               dlg.m_Upstream = pSelLogEntry->m_CommitHash;\r
+\r
+                               if(dlg.DoModal() == IDOK)\r
+                               {\r
+                                       Refresh();\r
+                               }\r
+                       }\r
+\r
+                       break;\r
+\r
                default:\r
                        //CMessageBox::Show(NULL,_T("Have not implemented"),_T("TortoiseGit"),MB_OK);\r
                        break;\r
index e1f0cdf..4cdfcdf 100644 (file)
@@ -20,6 +20,7 @@ CRebaseDlg::CRebaseDlg(CWnd* pParent /*=NULL*/)
        m_RebaseStage=CHOOSE_BRANCH;\r
        m_CurrentRebaseIndex=-1;\r
        m_bThreadRunning =FALSE;\r
+       this->m_IsCherryPick = FALSE;\r
 }\r
 \r
 CRebaseDlg::~CRebaseDlg()\r
@@ -172,17 +173,30 @@ BOOL CRebaseDlg::OnInitDialog()
 //     m_CommitList.m_IsOldFirst = TRUE;\r
        m_CommitList.m_IsRebaseReplaceGraph = TRUE;\r
 \r
-       m_CommitList.DeleteAllItems();\r
        m_CommitList.InsertGitColumn();\r
 \r
-       FetchLogList();\r
-       SetContinueButtonText();\r
        this->SetControlEnable();\r
 \r
+       if(m_IsCherryPick)\r
+       {\r
+               this->m_BranchCtrl.SetCurSel(-1);\r
+               this->m_BranchCtrl.EnableWindow(FALSE);\r
+               this->m_UpstreamCtrl.EnableWindow(FALSE);\r
+               this->SetWindowText(_T("Cherry Pick"));\r
+               this->m_CommitList.StartFilter();\r
+\r
+       }else\r
+       {\r
+               SetContinueButtonText();\r
+               m_CommitList.DeleteAllItems();\r
+               FetchLogList();\r
+       }\r
+\r
        m_CommitList.m_ContextMenuMask &= ~(m_CommitList.GetContextMenuBit(CGitLogListBase::ID_CHERRY_PICK)|\r
                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_SWITCHTOREV)|\r
                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_RESET)|\r
                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTREV)|\r
+                                                                               m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_TO_VERSION)|\r
                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTTOREV));\r
 \r
        return TRUE;\r
@@ -343,6 +357,11 @@ void CRebaseDlg::LoadBranchInfo()
        AddBranchToolTips(&m_BranchCtrl);\r
        AddBranchToolTips(&m_UpstreamCtrl);\r
 \r
+       if(!m_Upstream.IsEmpty())\r
+       {\r
+               m_UpstreamCtrl.AddString(m_Upstream);\r
+               m_UpstreamCtrl.SetCurSel(m_UpstreamCtrl.GetCount()-1);\r
+       }\r
 }\r
 \r
 void CRebaseDlg::OnCbnSelchangeBranch()\r
@@ -753,8 +772,11 @@ void CRebaseDlg::SetControlEnable()
                this->GetDlgItem(IDC_PICK_ALL)->EnableWindow(TRUE);\r
                this->GetDlgItem(IDC_EDIT_ALL)->EnableWindow(TRUE);\r
                this->GetDlgItem(IDC_SQUASH_ALL)->EnableWindow(TRUE);\r
-               this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH)->EnableWindow(TRUE);\r
-               this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM)->EnableWindow(TRUE);\r
+               if(!m_IsCherryPick)\r
+               {\r
+                       this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH)->EnableWindow(TRUE);\r
+                       this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM)->EnableWindow(TRUE);\r
+               }\r
                //this->m_CommitList.m_IsEnableRebaseMenu=TRUE;\r
                this->m_CommitList.m_ContextMenuMask |= m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_PICK)|\r
                                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_SQUASH)|\r
@@ -1084,8 +1106,14 @@ void CRebaseDlg::OnBnClickedAbort()
        CString cmd,out;\r
        if(m_OrigUpstreamHash.IsEmpty())\r
        {\r
-               this->OnCancel();\r
+               __super::OnCancel();\r
        }\r
+       \r
+       if(m_RebaseStage == CHOOSE_BRANCH || m_RebaseStage== CHOOSE_COMMIT_PICK_MODE)\r
+       {\r
+               return;\r
+       }\r
+\r
        if(CMessageBox::Show(NULL,_T("Are you sure abort rebase"),_T("TortoiseGit"),MB_YESNO) != IDYES)\r
                return;\r
 \r
index fbd6b6f..05523c8 100644 (file)
@@ -116,6 +116,9 @@ public:
 \r
        CHistoryCombo m_BranchCtrl;\r
        CHistoryCombo m_UpstreamCtrl;\r
+       \r
+       CString           m_Upstream;\r
+       BOOL              m_IsCherryPick;\r
 \r
        REBASE_STAGE       m_RebaseStage;\r
 \r