OSDN Git Service

Add post action button for rebase dialog. Such as send patch by email
authorFrank Li <lznuaa@gmail.com>
Wed, 15 Jul 2009 08:00:15 +0000 (16:00 +0800)
committerFrank Li <lznuaa@gmail.com>
Wed, 15 Jul 2009 08:00:15 +0000 (16:00 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/AppUtils.cpp
src/TortoiseProc/AppUtils.h
src/TortoiseProc/Commands/FetchCommand.cpp
src/TortoiseProc/Commands/FormatPatchCommand.cpp
src/TortoiseProc/RebaseDlg.cpp
src/TortoiseProc/RebaseDlg.h
src/TortoiseProc/resource.h

index e192c14..f37e399 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index a327d77..303f989 100644 (file)
@@ -1992,6 +1992,32 @@ bool CAppUtils::SendPatchMail(CTGitPathList &list,bool autoclose)
        }\r
        return false;\r
 }\r
+\r
+bool CAppUtils::SendPatchMail(CString &cmd,CString &formatpatchoutput,bool autoclose)\r
+{\r
+       CTGitPathList list;\r
+       CString log=formatpatchoutput;\r
+       int start=log.Find(cmd);\r
+       if(start >=0)\r
+               CString one=log.Tokenize(_T("\n"),start);\r
+       else\r
+               start = 0;\r
+\r
+       while(start>=0)\r
+       {\r
+               CString one=log.Tokenize(_T("\n"),start);\r
+               one=one.Trim();\r
+               if(one.IsEmpty())\r
+                       continue;\r
+               one.Replace(_T('/'),_T('\\'));\r
+               CTGitPath path;\r
+               path.SetFromWin(one);\r
+               list.AddPath(path);\r
+       }\r
+       return SendPatchMail(list,autoclose);\r
+}\r
+\r
+\r
 int CAppUtils::GetLogOutputEncode(CGit *pGit)\r
 {\r
        CString cmd,output;\r
index 41f79b2..dea827e 100644 (file)
@@ -195,6 +195,7 @@ public:
        static CString ChooseRepository(CString *path);\r
 \r
        static bool SendPatchMail(CTGitPathList &pathlist,bool autoclose=false);\r
+       static bool SendPatchMail(CString &cmd,CString &formatpatchoutput,bool autoclose=false);\r
 \r
        static int  SaveCommitUnicodeFile(CString &filename, CString &mesage);\r
 \r
index e11ce89..e5953f9 100644 (file)
@@ -60,10 +60,26 @@ bool FetchCommand::Execute()
                if( (userResponse==IDC_PROGRESS_BUTTON1) || ( progress.m_GitStatus ==0 && dlg.m_bRebase) )\r
                {\r
                        CRebaseDlg dlg;\r
-                       if(dlg.DoModal() == IDOK)\r
+                       dlg.m_PostButtonText=_T("Email &Patch...");\r
+                       int response = dlg.DoModal();\r
+                       if(response == IDOK)\r
                        {\r
                                return TRUE;\r
                        }\r
+                       if(response == IDC_REBASE_POST_BUTTON)\r
+                       {\r
+                               CString cmd,out;\r
+                               cmd.Format(_T("git.exe  format-patch -o \"%s\" %s..%s"),\r
+                                       g_Git.m_CurrentDir,\r
+                                       dlg.m_Upstream,dlg.m_Branch);\r
+                               if(g_Git.Run(cmd,&out,CP_ACP))\r
+                               {\r
+                                       CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+                                       return FALSE;\r
+                               }\r
+\r
+                               CAppUtils::SendPatchMail(cmd,out);\r
+                       }\r
                        return TRUE;\r
                }\r
        }\r
index eea9c39..f816f40 100644 (file)
@@ -81,25 +81,7 @@ bool FormatPatchCommand::Execute()
                {\r
                        if(dlg.m_bSendMail)\r
                        {\r
-                               CTGitPathList list;\r
-                               CString log=progress.m_LogText;\r
-                               int start=log.Find(cmd);\r
-                               if(start >=0)\r
-                                       CString one=log.Tokenize(_T("\n"),start);\r
-\r
-                               while(start>=0)\r
-                               {\r
-                                       CString one=log.Tokenize(_T("\n"),start);\r
-                                       one=one.Trim();\r
-                                       if(one.IsEmpty())\r
-                                               continue;\r
-                                       one.Replace(_T('/'),_T('\\'));\r
-                                       CTGitPath path;\r
-                                       path.SetFromWin(one);\r
-                                       list.AddPath(path);\r
-                               }\r
-\r
-                               CAppUtils::SendPatchMail(list);\r
+                               CAppUtils::SendPatchMail(cmd,progress.m_LogText);\r
                        }\r
                }\r
                return !progress.m_GitStatus;\r
index c39c386..91d875e 100644 (file)
@@ -60,6 +60,8 @@ BEGIN_MESSAGE_MAP(CRebaseDlg, CResizableStandAloneDialog)
        ON_MESSAGE(MSG_REBASE_UPDATE_UI, OnRebaseUpdateUI)\r
        ON_BN_CLICKED(IDC_BUTTON_BROWSE, &CRebaseDlg::OnBnClickedButtonBrowse)\r
        ON_BN_CLICKED(IDC_REBASE_CHECK_FORCE, &CRebaseDlg::OnBnClickedRebaseCheckForce)\r
+       ON_STN_CLICKED(IDC_STATUS_STATIC, &CRebaseDlg::OnStnClickedStatusStatic)\r
+       ON_BN_CLICKED(IDC_REBASE_POST_BUTTON, &CRebaseDlg::OnBnClickedRebasePostButton)\r
 END_MESSAGE_MAP()\r
 \r
 void CRebaseDlg::AddRebaseAnchor()\r
@@ -80,6 +82,8 @@ void CRebaseDlg::AddRebaseAnchor()
        AddAnchor(IDC_REBASE_STATIC_BRANCH,TOP_LEFT);\r
        AddAnchor(IDHELP, BOTTOM_RIGHT);\r
        AddAnchor(IDC_REBASE_CHECK_FORCE,TOP_RIGHT);\r
+       AddAnchor(IDC_REBASE_POST_BUTTON,BOTTOM_LEFT);\r
+       \r
        this->AddOthersToAnchor();\r
 }\r
 \r
@@ -133,6 +137,9 @@ BOOL CRebaseDlg::OnInitDialog()
        m_tooltips.Create(this);\r
        \r
        m_tooltips.AddTool(IDC_REBASE_CHECK_FORCE,IDS_REBASE_FORCE_TT);\r
+       m_tooltips.AddTool(IDC_REBASE_ABORT,IDS_REBASE_ABORT_TT);\r
+       \r
+\r
 \r
        m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("RebaseDlg"),(SVNSLC_POPALL ^ SVNSLC_POPCOMMIT),false);\r
 \r
@@ -441,46 +448,45 @@ void CRebaseDlg::FetchLogList()
                        fmt.LoadString(IDS_REBASE_UPTODATE_FMT);\r
                        text.Format(fmt,m_BranchCtrl.GetString());\r
                        m_CommitList.ShowText(text);\r
+                       this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(m_CommitList.GetItemCount());\r
+                       return;\r
                }\r
-               \r
-       }else\r
-       {\r
-               m_CommitList.Clear();\r
-               this->m_CommitList.FillGitLog(NULL,0,&m_UpstreamCtrl.GetString(),&m_BranchCtrl.GetString());\r
-               if( m_CommitList.GetItemCount() == 0 )\r
-                       m_CommitList.ShowText(_T("Nothing to Rebase"));\r
+       }\r
+\r
+       m_CommitList.Clear();\r
+       this->m_CommitList.FillGitLog(NULL,0,&m_UpstreamCtrl.GetString(),&m_BranchCtrl.GetString());\r
+       if( m_CommitList.GetItemCount() == 0 )\r
+               m_CommitList.ShowText(_T("Nothing to Rebase"));\r
 \r
-               CString hash=g_Git.GetHash(m_UpstreamCtrl.GetString());\r
+       CString hash=g_Git.GetHash(m_UpstreamCtrl.GetString());\r
        \r
 #if 0\r
-               if(m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash.size() >=0 )\r
+       if(m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash.size() >=0 )\r
+       {\r
+               if(hash ==  m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash[0])\r
                {\r
-                       if(hash ==  m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash[0])\r
-                       {\r
-                               m_CommitList.Clear();\r
-                               m_CommitList.ShowText(_T("Nothing Rebase"));\r
-                       }\r
+                       m_CommitList.Clear();\r
+                       m_CommitList.ShowText(_T("Nothing Rebase"));\r
                }\r
+       }\r
 #endif\r
 \r
-               m_tooltips.Pop();\r
-               AddBranchToolTips(&this->m_BranchCtrl);\r
-               AddBranchToolTips(&this->m_UpstreamCtrl);\r
-       \r
-               for(int i=0;i<m_CommitList.m_logEntries.size();i++)\r
-               {\r
-                       m_CommitList.m_logEntries[i].m_Action = CTGitPath::LOGACTIONS_REBASE_PICK;\r
-               }\r
-       \r
-               m_CommitList.Invalidate();\r
-\r
-               if(m_CommitList.m_IsOldFirst)\r
-                       this->m_CurrentRebaseIndex = -1;\r
-               else\r
-                       this->m_CurrentRebaseIndex = m_CommitList.m_logEntries.size();\r
+       m_tooltips.Pop();\r
+       AddBranchToolTips(&this->m_BranchCtrl);\r
+       AddBranchToolTips(&this->m_UpstreamCtrl);\r
        \r
+       for(int i=0;i<m_CommitList.m_logEntries.size();i++)\r
+       {\r
+               m_CommitList.m_logEntries[i].m_Action = CTGitPath::LOGACTIONS_REBASE_PICK;\r
        }\r
 \r
+       m_CommitList.Invalidate();\r
+\r
+       if(m_CommitList.m_IsOldFirst)\r
+               this->m_CurrentRebaseIndex = -1;\r
+       else\r
+               this->m_CurrentRebaseIndex = m_CommitList.m_logEntries.size();\r
+       \r
        this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(m_CommitList.GetItemCount());\r
 }\r
 \r
@@ -913,6 +919,13 @@ void CRebaseDlg::SetControlEnable()
                                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_SQUASH)|\r
                                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_EDIT)|\r
                                                                                                m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_SKIP));\r
+\r
+               if( m_RebaseStage == REBASE_DONE && (!this->m_PostButtonText.IsEmpty()) )\r
+               {\r
+                       this->GetDlgItem(IDC_STATUS_STATIC)->ShowWindow(SW_HIDE);\r
+                       this->GetDlgItem(IDC_REBASE_POST_BUTTON)->ShowWindow(SW_SHOWNORMAL);\r
+                       this->GetDlgItem(IDC_REBASE_POST_BUTTON)->SetWindowText(this->m_PostButtonText);\r
+               }\r
                break;\r
        }\r
 \r
@@ -1289,3 +1302,17 @@ void CRebaseDlg::OnBnClickedRebaseCheckForce()
        this->UpdateData();\r
        this->FetchLogList();\r
 }\r
+\r
+void CRebaseDlg::OnStnClickedStatusStatic()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+}\r
+\r
+void CRebaseDlg::OnBnClickedRebasePostButton()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+       this->m_Upstream=this->m_UpstreamCtrl.GetString();\r
+       this->m_Branch=this->m_BranchCtrl.GetString();\r
+\r
+       this->EndDialog(IDC_REBASE_POST_BUTTON);\r
+}\r
index 6b981e8..2a301e1 100644 (file)
@@ -112,6 +112,7 @@ public:
     BOOL m_bEditAll;\r
        \r
        BOOL m_bForce;\r
+       CString m_PostButtonText;\r
 \r
        CSplitterControl        m_wndSplitter;\r
        CMFCTabCtrl m_ctrlTabCtrl;\r
@@ -124,6 +125,8 @@ public:
        CHistoryCombo m_UpstreamCtrl;\r
        \r
        CString           m_Upstream;\r
+       CString           m_Branch;\r
+\r
        BOOL              m_IsCherryPick;\r
 \r
        REBASE_STAGE       m_RebaseStage;\r
@@ -137,4 +140,6 @@ public:
        int  GoNext();\r
        afx_msg void OnBnClickedButtonBrowse();\r
        afx_msg void OnBnClickedRebaseCheckForce();\r
+       afx_msg void OnStnClickedStatusStatic();\r
+       afx_msg void OnBnClickedRebasePostButton();\r
 };\r
index 6ba4b02..67b1957 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ