1 // RebaseDlg.cpp : implementation file
5 #include "TortoiseProc.h"
8 #include "MessageBox.h"
9 #include "UnicodeUtils.h"
10 #include "BrowseRefsDlg.h"
11 #include "ProgressDlg.h"
14 IMPLEMENT_DYNAMIC(CRebaseDlg
, CResizableStandAloneDialog
)
16 CRebaseDlg::CRebaseDlg(CWnd
* pParent
/*=NULL*/)
17 : CResizableStandAloneDialog(CRebaseDlg::IDD
, pParent
)
22 m_RebaseStage
=CHOOSE_BRANCH
;
23 m_CurrentRebaseIndex
=-1;
24 m_bThreadRunning
=FALSE
;
25 this->m_IsCherryPick
= FALSE
;
27 m_IsFastForward
=FALSE
;
30 CRebaseDlg::~CRebaseDlg()
34 void CRebaseDlg::DoDataExchange(CDataExchange
* pDX
)
36 CDialog::DoDataExchange(pDX
);
37 DDX_Control(pDX
, IDC_REBASE_PROGRESS
, m_ProgressBar
);
38 DDX_Control(pDX
, IDC_STATUS_STATIC
, m_CtrlStatusText
);
39 DDX_Check(pDX
, IDC_PICK_ALL
, m_bPickAll
);
40 DDX_Check(pDX
, IDC_SQUASH_ALL
, m_bSquashAll
);
41 DDX_Check(pDX
, IDC_EDIT_ALL
, m_bEditAll
);
42 DDX_Control(pDX
, IDC_REBASE_SPLIT
, m_wndSplitter
);
43 DDX_Control(pDX
,IDC_COMMIT_LIST
,m_CommitList
);
44 DDX_Control(pDX
,IDC_REBASE_COMBOXEX_BRANCH
, this->m_BranchCtrl
);
45 DDX_Control(pDX
,IDC_REBASE_COMBOXEX_UPSTREAM
, this->m_UpstreamCtrl
);
46 DDX_Check(pDX
, IDC_REBASE_CHECK_FORCE
,m_bForce
);
51 BEGIN_MESSAGE_MAP(CRebaseDlg
, CResizableStandAloneDialog
)
52 ON_BN_CLICKED(IDC_PICK_ALL
, &CRebaseDlg::OnBnClickedPickAll
)
53 ON_BN_CLICKED(IDC_SQUASH_ALL
, &CRebaseDlg::OnBnClickedSquashAll
)
54 ON_BN_CLICKED(IDC_EDIT_ALL
, &CRebaseDlg::OnBnClickedEditAll
)
55 ON_BN_CLICKED(IDC_REBASE_SPLIT
, &CRebaseDlg::OnBnClickedRebaseSplit
)
56 ON_BN_CLICKED(IDC_REBASE_CONTINUE
,OnBnClickedContinue
)
57 ON_BN_CLICKED(IDC_REBASE_ABORT
, OnBnClickedAbort
)
59 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_BRANCH
, &CRebaseDlg::OnCbnSelchangeBranch
)
60 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_UPSTREAM
, &CRebaseDlg::OnCbnSelchangeUpstream
)
61 ON_MESSAGE(MSG_REBASE_UPDATE_UI
, OnRebaseUpdateUI
)
62 ON_BN_CLICKED(IDC_BUTTON_BROWSE
, &CRebaseDlg::OnBnClickedButtonBrowse
)
63 ON_BN_CLICKED(IDC_REBASE_CHECK_FORCE
, &CRebaseDlg::OnBnClickedRebaseCheckForce
)
64 ON_STN_CLICKED(IDC_STATUS_STATIC
, &CRebaseDlg::OnStnClickedStatusStatic
)
65 ON_BN_CLICKED(IDC_REBASE_POST_BUTTON
, &CRebaseDlg::OnBnClickedRebasePostButton
)
68 void CRebaseDlg::AddRebaseAnchor()
70 AddAnchor(IDC_REBASE_TAB
,TOP_LEFT
,BOTTOM_RIGHT
);
71 AddAnchor(IDC_COMMIT_LIST
,TOP_LEFT
, TOP_RIGHT
);
72 AddAnchor(IDC_REBASE_SPLIT
,TOP_LEFT
, TOP_RIGHT
);
73 AddAnchor(IDC_STATUS_STATIC
, BOTTOM_LEFT
,BOTTOM_RIGHT
);
74 AddAnchor(IDC_REBASE_CONTINUE
,BOTTOM_RIGHT
);
75 AddAnchor(IDC_REBASE_ABORT
, BOTTOM_RIGHT
);
76 AddAnchor(IDC_REBASE_PROGRESS
,BOTTOM_LEFT
, BOTTOM_RIGHT
);
77 AddAnchor(IDC_PICK_ALL
,TOP_LEFT
);
78 AddAnchor(IDC_SQUASH_ALL
,TOP_LEFT
);
79 AddAnchor(IDC_EDIT_ALL
,TOP_LEFT
);
80 AddAnchor(IDC_REBASE_COMBOXEX_UPSTREAM
,TOP_LEFT
);
81 AddAnchor(IDC_REBASE_COMBOXEX_BRANCH
,TOP_LEFT
);
82 AddAnchor(IDC_REBASE_STATIC_UPSTREAM
,TOP_LEFT
);
83 AddAnchor(IDC_REBASE_STATIC_BRANCH
,TOP_LEFT
);
84 AddAnchor(IDHELP
, BOTTOM_RIGHT
);
85 AddAnchor(IDC_REBASE_CHECK_FORCE
,TOP_RIGHT
);
86 AddAnchor(IDC_REBASE_POST_BUTTON
,BOTTOM_LEFT
);
88 this->AddOthersToAnchor();
91 BOOL
CRebaseDlg::OnInitDialog()
93 CResizableStandAloneDialog::OnInitDialog();
98 GetClientRect(m_DlgOrigRect
);
99 m_CommitList
.GetClientRect(m_CommitListOrigRect
);
101 CWnd
*pwnd
=this->GetDlgItem(IDC_REBASE_DUMY_TAB
);
102 pwnd
->GetWindowRect(&rectDummy
);
103 this->ScreenToClient(rectDummy
);
105 if (!m_ctrlTabCtrl
.Create(CMFCTabCtrl::STYLE_FLAT
, rectDummy
, this, IDC_REBASE_TAB
))
107 TRACE0("Failed to create output tab window\n");
108 return FALSE
; // fail to create
110 m_ctrlTabCtrl
.SetResizeMode(CMFCTabCtrl::RESIZE_NO
);
111 // Create output panes:
112 //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
113 DWORD dwStyle
=LVS_REPORT
| LVS_SHOWSELALWAYS
| LVS_ALIGNLEFT
| WS_BORDER
| WS_TABSTOP
|LVS_SINGLESEL
|WS_CHILD
| WS_VISIBLE
;
115 if (! this->m_FileListCtrl
.Create(dwStyle
,rectDummy
,&this->m_ctrlTabCtrl
,0) )
117 TRACE0("Failed to create output windows\n");
118 return FALSE
; // fail to create
121 if( ! this->m_LogMessageCtrl
.Create(_T("Scintilla"),_T("source"),0,rectDummy
,&m_ctrlTabCtrl
,0,0) )
123 TRACE0("Failed to create log message control");
126 m_LogMessageCtrl
.Init(0);
128 dwStyle
= LBS_NOINTEGRALHEIGHT
| WS_CHILD
| WS_VISIBLE
| WS_HSCROLL
| WS_VSCROLL
;
130 if (!m_wndOutputRebase
.Create(_T("Scintilla"),_T("source"),0,rectDummy
, &m_ctrlTabCtrl
, 0,0) )
132 TRACE0("Failed to create output windows\n");
133 return -1; // fail to create
135 m_wndOutputRebase
.Init(0);
136 m_wndOutputRebase
.Call(SCI_SETREADONLY
, TRUE
);
138 m_tooltips
.Create(this);
140 m_tooltips
.AddTool(IDC_REBASE_CHECK_FORCE
,IDS_REBASE_FORCE_TT
);
141 m_tooltips
.AddTool(IDC_REBASE_ABORT
,IDS_REBASE_ABORT_TT
);
145 m_FileListCtrl
.Init(SVNSLC_COLEXT
| SVNSLC_COLSTATUS
|SVNSLC_COLADD
|SVNSLC_COLDEL
, _T("RebaseDlg"),(SVNSLC_POPALL
^ SVNSLC_POPCOMMIT
),false);
147 m_ctrlTabCtrl
.AddTab(&m_FileListCtrl
,_T("Conflict File"));
148 m_ctrlTabCtrl
.AddTab(&m_LogMessageCtrl
,_T("Commit Message"),1);
149 m_ctrlTabCtrl
.AddTab(&m_wndOutputRebase
,_T("Log"),2);
153 EnableSaveRestore(_T("RebaseDlg"));
155 DWORD yPos
= CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
156 RECT rcDlg
, rcLogMsg
, rcFileList
;
157 GetClientRect(&rcDlg
);
158 m_CommitList
.GetWindowRect(&rcLogMsg
);
159 ScreenToClient(&rcLogMsg
);
160 this->m_ctrlTabCtrl
.GetWindowRect(&rcFileList
);
161 ScreenToClient(&rcFileList
);
165 m_wndSplitter
.GetWindowRect(&rectSplitter
);
166 ScreenToClient(&rectSplitter
);
167 int delta
= yPos
- rectSplitter
.top
;
168 if ((rcLogMsg
.bottom
+ delta
> rcLogMsg
.top
)&&(rcLogMsg
.bottom
+ delta
< rcFileList
.bottom
- 30))
170 m_wndSplitter
.SetWindowPos(NULL
, 0, yPos
, 0, 0, SWP_NOSIZE
);
175 if( this->m_RebaseStage
== CHOOSE_BRANCH
)
177 this->LoadBranchInfo();
181 this->m_BranchCtrl
.EnableWindow(FALSE
);
182 this->m_UpstreamCtrl
.EnableWindow(FALSE
);
185 m_CommitList
.m_IsIDReplaceAction
= TRUE
;
186 // m_CommitList.m_IsOldFirst = TRUE;
187 m_CommitList
.m_IsRebaseReplaceGraph
= TRUE
;
189 m_CommitList
.InsertGitColumn();
191 this->SetControlEnable();
193 if(!this->m_PreCmd
.IsEmpty())
195 CProgressDlg progress
;
196 progress
.m_GitCmd
=m_PreCmd
;
197 progress
.m_bAutoCloseOnSuccess
=true;
203 this->m_BranchCtrl
.SetCurSel(-1);
204 this->m_BranchCtrl
.EnableWindow(FALSE
);
205 this->m_UpstreamCtrl
.EnableWindow(FALSE
);
206 this->SetWindowText(_T("Cherry Pick"));
207 this->m_CommitList
.StartFilter();
211 SetContinueButtonText();
212 m_CommitList
.DeleteAllItems();
216 m_CommitList
.m_ContextMenuMask
&= ~(m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_CHERRY_PICK
)|
217 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_SWITCHTOREV
)|
218 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_RESET
)|
219 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REVERTREV
)|
220 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_TO_VERSION
)|
221 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REVERTTOREV
)|
222 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_COMBINE_COMMIT
));
224 if(m_CommitList
.m_IsOldFirst
)
225 this->m_CurrentRebaseIndex
= -1;
227 this->m_CurrentRebaseIndex
= m_CommitList
.m_logEntries
.size();
232 // CRebaseDlg message handlers
234 void CRebaseDlg::OnBnClickedPickAll()
236 // TODO: Add your control notification handler code here
239 this->SetAllRebaseAction(CTGitPath::LOGACTIONS_REBASE_PICK
);
241 this->m_bEditAll
=FALSE
;
242 this->m_bSquashAll
=FALSE
;
243 this->UpdateData(FALSE
);
247 void CRebaseDlg::OnBnClickedSquashAll()
249 // TODO: Add your control notification handler code here
251 if(this->m_bSquashAll
)
252 this->SetAllRebaseAction(CTGitPath::LOGACTIONS_REBASE_SQUASH
);
254 this->m_bEditAll
=FALSE
;
255 this->m_bPickAll
=FALSE
;
256 this->UpdateData(FALSE
);
260 void CRebaseDlg::OnBnClickedEditAll()
262 // TODO: Add your control notification handler code here
264 if( this->m_bEditAll
)
265 this->SetAllRebaseAction(CTGitPath::LOGACTIONS_REBASE_EDIT
);
267 this->m_bPickAll
=FALSE
;
268 this->m_bSquashAll
=FALSE
;
269 this->UpdateData(FALSE
);
273 void CRebaseDlg::SetAllRebaseAction(int action
)
275 for(int i
=0;i
<this->m_CommitList
.m_logEntries
.size();i
++)
277 m_CommitList
.m_logEntries
[i
].m_Action
=action
;
279 m_CommitList
.Invalidate();
282 void CRebaseDlg::OnBnClickedRebaseSplit()
285 // TODO: Add your control notification handler code here
288 LRESULT
CRebaseDlg::DefWindowProc(UINT message
, WPARAM wParam
, LPARAM lParam
)
292 if (wParam
== IDC_REBASE_SPLIT
)
294 SPC_NMHDR
* pHdr
= (SPC_NMHDR
*) lParam
;
300 return __super::DefWindowProc(message
, wParam
, lParam
);
303 void CRebaseDlg::DoSize(int delta
)
306 this->RemoveAllAnchors();
308 CSplitterControl::ChangeHeight(GetDlgItem(IDC_COMMIT_LIST
), delta
, CW_TOPALIGN
);
309 //CSplitterControl::ChangeHeight(GetDlgItem(), delta, CW_TOPALIGN);
310 CSplitterControl::ChangeHeight(GetDlgItem(IDC_REBASE_TAB
), -delta
, CW_BOTTOMALIGN
);
311 //CSplitterControl::ChangeHeight(GetDlgItem(), -delta, CW_BOTTOMALIGN);
312 CSplitterControl::ChangePos(GetDlgItem(IDC_SQUASH_ALL
),0,delta
);
313 CSplitterControl::ChangePos(GetDlgItem(IDC_PICK_ALL
),0,delta
);
314 CSplitterControl::ChangePos(GetDlgItem(IDC_EDIT_ALL
),0,delta
);
316 this->AddRebaseAnchor();
317 // adjust the minimum size of the dialog to prevent the resizing from
318 // moving the list control too far down.
320 m_CommitList
.GetClientRect(rcLogMsg
);
321 SetMinTrackSize(CSize(m_DlgOrigRect
.Width(), m_DlgOrigRect
.Height()-m_CommitListOrigRect
.Height()+rcLogMsg
.Height()));
324 // m_CommitList.Invalidate();
326 // GetDlgItem(IDC_LOGMESSAGE)->Invalidate();
328 this->m_ctrlTabCtrl
.Invalidate();
329 this->m_CommitList
.Invalidate();
330 this->m_FileListCtrl
.Invalidate();
331 this->m_LogMessageCtrl
.Invalidate();
335 void CRebaseDlg::SetSplitterRange()
337 if ((m_CommitList
)&&(m_ctrlTabCtrl
))
340 m_CommitList
.GetWindowRect(rcTop
);
341 ScreenToClient(rcTop
);
343 m_ctrlTabCtrl
.GetWindowRect(rcMiddle
);
344 ScreenToClient(rcMiddle
);
345 if (rcMiddle
.Height() && rcMiddle
.Width())
346 m_wndSplitter
.SetRange(rcTop
.top
+60, rcMiddle
.bottom
-80);
350 void CRebaseDlg::OnSize(UINT nType
,int cx
, int cy
)
352 // first, let the resizing take place
353 __super::OnSize(nType
, cx
, cy
);
359 void CRebaseDlg::SaveSplitterPos()
363 CRegDWORD regPos
= CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
365 m_wndSplitter
.GetWindowRect(&rectSplitter
);
366 ScreenToClient(&rectSplitter
);
367 regPos
= rectSplitter
.top
;
371 void CRebaseDlg::LoadBranchInfo()
373 m_BranchCtrl
.SetMaxHistoryItems(0x7FFFFFFF);
374 m_UpstreamCtrl
.SetMaxHistoryItems(0x7FFFFFFF);
379 g_Git
.GetBranchList(list
,¤t
,CGit::BRANCH_ALL
);
380 m_BranchCtrl
.AddString(list
);
381 m_UpstreamCtrl
.AddString(list
);
383 m_BranchCtrl
.SetCurSel(current
);
385 AddBranchToolTips(&m_BranchCtrl
);
386 AddBranchToolTips(&m_UpstreamCtrl
);
388 if(!m_Upstream
.IsEmpty())
390 m_UpstreamCtrl
.AddString(m_Upstream
);
391 m_UpstreamCtrl
.SetCurSel(m_UpstreamCtrl
.GetCount()-1);
395 //Select pull-remote from current branch
396 CString currentBranch
= g_Git
.GetSymbolicRef();
398 configName
.Format(L
"branch.%s.remote", currentBranch
);
399 CString pullRemote
= g_Git
.GetConfigValue(configName
);
401 //Select pull-branch from current branch
402 configName
.Format(L
"branch.%s.merge", currentBranch
);
403 CString pullBranch
= CGit::StripRefName(g_Git
.GetConfigValue(configName
));
405 CString defaultUpstream
;
406 defaultUpstream
.Format(L
"remotes/%s/%s", pullRemote
, pullBranch
);
407 int found
= m_UpstreamCtrl
.FindStringExact(0, defaultUpstream
);
409 m_UpstreamCtrl
.SetCurSel(found
);
413 void CRebaseDlg::OnCbnSelchangeBranch()
418 void CRebaseDlg::OnCbnSelchangeUpstream()
423 void CRebaseDlg::FetchLogList()
427 m_IsFastForward
=FALSE
;
428 cmd
.Format(_T("git.exe merge-base %s %s"), m_UpstreamCtrl
.GetString(),m_BranchCtrl
.GetString());
429 if(g_Git
.Run(cmd
,&base
,CP_ACP
))
431 CMessageBox::Show(NULL
,base
,_T("TortoiseGit"),MB_OK
|MB_ICONERROR
);
436 hash
=g_Git
.GetHash(m_BranchCtrl
.GetString());
438 if(hash
== g_Git
.GetHash(this->m_UpstreamCtrl
.GetString()))
440 m_CommitList
.Clear();
442 fmt
.LoadString(IDS_REBASE_EQUAL_FMT
);
443 text
.Format(fmt
,m_BranchCtrl
.GetString(),this->m_UpstreamCtrl
.GetString());
445 m_CommitList
.ShowText(text
);
446 this->GetDlgItem(IDC_REBASE_CONTINUE
)->EnableWindow(false);
455 this->m_IsFastForward
=TRUE
;
457 m_CommitList
.Clear();
459 fmt
.LoadString(IDS_REBASE_FASTFORWARD_FMT
);
460 text
.Format(fmt
,m_BranchCtrl
.GetString(),this->m_UpstreamCtrl
.GetString(),
461 m_BranchCtrl
.GetString(),this->m_UpstreamCtrl
.GetString());
463 m_CommitList
.ShowText(text
);
464 this->GetDlgItem(IDC_REBASE_CONTINUE
)->EnableWindow(true);
465 SetContinueButtonText();
474 cmd
.Format(_T("git.exe rev-parse %s"), m_UpstreamCtrl
.GetString());
475 if( g_Git
.Run(cmd
,&hash
,CP_ACP
))
477 CMessageBox::Show(NULL
,base
,_T("TortoiseGit"),MB_OK
|MB_ICONERROR
);
484 m_CommitList
.Clear();
486 fmt
.LoadString(IDS_REBASE_UPTODATE_FMT
);
487 text
.Format(fmt
,m_BranchCtrl
.GetString());
488 m_CommitList
.ShowText(text
);
489 this->GetDlgItem(IDC_REBASE_CONTINUE
)->EnableWindow(m_CommitList
.GetItemCount());
490 SetContinueButtonText();
495 m_CommitList
.Clear();
496 this->m_CommitList
.FillGitLog(NULL
,0,&m_UpstreamCtrl
.GetString(),&m_BranchCtrl
.GetString());
497 if( m_CommitList
.GetItemCount() == 0 )
498 m_CommitList
.ShowText(_T("Nothing to Rebase"));
500 hash
=g_Git
.GetHash(m_UpstreamCtrl
.GetString());
503 if(m_CommitList
.m_logEntries
[m_CommitList
.m_logEntries
.size()-1].m_ParentHash
.size() >=0 )
505 if(hash
== m_CommitList
.m_logEntries
[m_CommitList
.m_logEntries
.size()-1].m_ParentHash
[0])
507 m_CommitList
.Clear();
508 m_CommitList
.ShowText(_T("Nothing Rebase"));
514 AddBranchToolTips(&this->m_BranchCtrl
);
515 AddBranchToolTips(&this->m_UpstreamCtrl
);
517 for(int i
=0;i
<m_CommitList
.m_logEntries
.size();i
++)
519 m_CommitList
.m_logEntries
[i
].m_Action
= CTGitPath::LOGACTIONS_REBASE_PICK
;
522 m_CommitList
.Invalidate();
524 if(m_CommitList
.m_IsOldFirst
)
525 this->m_CurrentRebaseIndex
= -1;
527 this->m_CurrentRebaseIndex
= m_CommitList
.m_logEntries
.size();
529 this->GetDlgItem(IDC_REBASE_CONTINUE
)->EnableWindow(m_CommitList
.GetItemCount());
530 SetContinueButtonText();
533 void CRebaseDlg::AddBranchToolTips(CHistoryCombo
*pBranch
)
537 CString text
=pBranch
->GetString();
540 g_Git
.GetLog(data
,text
,NULL
,1,0);
542 rev
.ParserFromLog(data
);
543 tooltip
.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
546 CAppUtils::FormatDateAndTime(rev
.m_AuthorDate
,DATE_LONGDATE
),
550 pBranch
->DisableTooltip();
551 this->m_tooltips
.AddTool(pBranch
->GetComboBoxCtrl(),tooltip
);
555 BOOL
CRebaseDlg::PreTranslateMessage(MSG
*pMsg
)
557 m_tooltips
.RelayEvent(pMsg
);
558 return CResizableStandAloneDialog::PreTranslateMessage(pMsg
);
560 int CRebaseDlg::CheckRebaseCondition()
562 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_LOG
);
564 if( !g_Git
.CheckCleanWorkTree() )
566 CMessageBox::Show(NULL
,_T("Rebase Need Clean Working Tree"),_T("TortoiseGit"),MB_OK
);
569 //Todo Check $REBASE_ROOT
573 cmd
=_T("git.exe var GIT_COMMITTER_IDENT");
574 if(g_Git
.Run(cmd
,NULL
,CP_UTF8
))
577 //Todo call pre_rebase_hook
580 int CRebaseDlg::StartRebase()
584 if(!this->m_IsCherryPick
)
586 //Todo call comment_for_reflog
587 cmd
.Format(_T("git.exe checkout %s"),this->m_BranchCtrl
.GetString());
588 this->AddLogString(cmd
);
590 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
593 this->AddLogString(out
);
596 cmd
=_T("git.exe rev-parse --verify HEAD");
597 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
599 AddLogString(_T("No Head"));
603 //git symbolic-ref HEAD > "$DOTEST"/head-name 2> /dev/null ||
604 // echo "detached HEAD" > "$DOTEST"/head-name
606 cmd
.Format(_T("git.exe update-ref ORIG_HEAD HEAD"));
607 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
609 AddLogString(_T("update ORIG_HEAD Fail"));
613 if( !this->m_IsCherryPick
)
615 cmd
.Format(_T("git.exe checkout %s"),this->m_UpstreamCtrl
.GetString());
616 this->AddLogString(cmd
);
619 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
625 m_OrigUpstreamHash
.Empty();
626 m_OrigUpstreamHash
= g_Git
.GetHash(this->m_UpstreamCtrl
.GetString());
627 if(m_OrigUpstreamHash
.IsEmpty())
629 this->AddLogString(m_OrigUpstreamHash
);
633 if( !this->m_IsCherryPick
)
635 cmd
.Format(_T("git.exe rev-parse %s"),this->m_BranchCtrl
.GetString());
636 if(g_Git
.Run(cmd
,&this->m_OrigBranchHash
,CP_UTF8
))
638 this->AddLogString(m_OrigBranchHash
);
641 this->AddLogString(_T("Start Rebase\r\n"));
644 this->AddLogString(_T("Start Cherry-pick\r\n"));
648 int CRebaseDlg::VerifyNoConflict()
651 if(g_Git
.ListConflictFile(list
))
653 AddLogString(_T("Get conflict files fail"));
656 if( list
.GetCount() != 0 )
658 CMessageBox::Show(NULL
,_T("There are conflict file, you should mark it resolve"),_T("TortoiseGit"),MB_OK
);
664 int CRebaseDlg::FinishRebase()
666 if(this->m_IsCherryPick
) //cherry pick mode no "branch", working at upstream branch
670 cmd
.Format(_T("git.exe branch -f %s"),this->m_BranchCtrl
.GetString());
671 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
677 cmd
.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash
);
678 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
684 cmd
.Format(_T("git.exe checkout -f %s"),this->m_BranchCtrl
.GetString());
685 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
692 void CRebaseDlg::OnBnClickedContinue()
694 if( m_RebaseStage
== REBASE_DONE
)
700 if( this->m_IsFastForward
)
703 CString oldbranch
= g_Git
.GetCurrentBranch();
704 if( oldbranch
!= m_BranchCtrl
.GetString() )
706 cmd
.Format(_T("git.exe checkout %s"),m_BranchCtrl
.GetString());
708 if( g_Git
.Run(cmd
,&out
,CP_ACP
) )
710 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_LOG
);
717 m_OrigBranchHash
= g_Git
.GetHash(m_BranchCtrl
.GetString());
718 m_OrigUpstreamHash
= g_Git
.GetHash(this->m_UpstreamCtrl
.GetString());
720 if(!g_Git
.IsFastForward(this->m_BranchCtrl
.GetString(),this->m_UpstreamCtrl
.GetString()))
722 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_LOG
);
723 AddLogString(_T("No fast forward\r\nMaybe repository changed"));
727 cmd
.Format(_T("git.exe reset --hard %s"),this->m_UpstreamCtrl
.GetString());
728 this->AddLogString(CString(_T("Fast forward to "))+m_UpstreamCtrl
.GetString());
731 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_LOG
);
732 if(g_Git
.Run(cmd
,&out
,CP_ACP
))
734 AddLogString(_T("Fail"));
739 AddLogString(_T("Done"));
740 m_RebaseStage
= REBASE_DONE
;
741 UpdateCurrentStatus();
745 if( m_RebaseStage
== CHOOSE_BRANCH
|| m_RebaseStage
== CHOOSE_COMMIT_PICK_MODE
)
747 if(CheckRebaseCondition())
749 m_RebaseStage
= REBASE_START
;
753 if( m_RebaseStage
== REBASE_FINISH
)
761 if( m_RebaseStage
== REBASE_SQUASH_CONFLICT
)
763 if(VerifyNoConflict())
765 GitRev
*curRev
=(GitRev
*)m_CommitList
.m_arShownList
[m_CurrentRebaseIndex
];
766 if(this->CheckNextCommitIsSquash())
767 {//next commit is not squash;
768 m_RebaseStage
= REBASE_SQUASH_EDIT
;
769 this->OnRebaseUpdateUI(0,0);
770 this->UpdateCurrentStatus();
774 m_RebaseStage
=REBASE_CONTINUE
;
775 curRev
->m_Action
|=CTGitPath::LOGACTIONS_REBASE_DONE
;
776 this->UpdateCurrentStatus();
780 if( m_RebaseStage
== REBASE_CONFLICT
)
782 if(VerifyNoConflict())
785 GitRev
*curRev
=(GitRev
*)m_CommitList
.m_arShownList
[m_CurrentRebaseIndex
];
789 cmd
.Format(_T("git.exe commit -C %s"), curRev
->m_CommitHash
);
791 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
793 if(!g_Git
.CheckCleanWorkTree())
795 CMessageBox::Show(NULL
,out
,_T("TortoiseGit"),MB_OK
|MB_ICONERROR
);
801 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_LOG
);
802 if( curRev
->m_Action
& CTGitPath::LOGACTIONS_REBASE_EDIT
)
804 m_RebaseStage
=REBASE_EDIT
;
805 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_MESSAGE
);
806 this->UpdateCurrentStatus();
811 m_RebaseStage
=REBASE_CONTINUE
;
812 curRev
->m_Action
|=CTGitPath::LOGACTIONS_REBASE_DONE
;
813 this->UpdateCurrentStatus();
818 if( m_RebaseStage
== REBASE_EDIT
|| m_RebaseStage
== REBASE_SQUASH_EDIT
)
821 GitRev
*curRev
=(GitRev
*)m_CommitList
.m_arShownList
[m_CurrentRebaseIndex
];
823 str
=this->m_LogMessageCtrl
.GetText();
824 if(str
.Trim().IsEmpty())
826 CMessageBox::Show(NULL
,_T("Commit Message Is Empty"),_T("TortoiseGit"),MB_OK
|MB_ICONERROR
);
830 CString tempfile
=::GetTempFile();
831 CFile
file(tempfile
,CFile::modeReadWrite
|CFile::modeCreate
);
832 CStringA log
=CUnicodeUtils::GetUTF8( str
);
833 file
.Write(log
,log
.GetLength());
834 //file.WriteString(m_sLogMessage);
839 if( m_RebaseStage
== REBASE_SQUASH_EDIT
)
840 cmd
.Format(_T("git.exe commit -F \"%s\""), tempfile
);
842 cmd
.Format(_T("git.exe commit --amend -F \"%s\""), tempfile
);
844 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
846 if(!g_Git
.CheckCleanWorkTree())
848 CMessageBox::Show(NULL
,out
,_T("TortoiseGit"),MB_OK
|MB_ICONERROR
);
853 CFile::Remove(tempfile
);
855 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_LOG
);
856 m_RebaseStage
=REBASE_CONTINUE
;
857 curRev
->m_Action
|=CTGitPath::LOGACTIONS_REBASE_DONE
;
858 this->UpdateCurrentStatus();
862 InterlockedExchange(&m_bThreadRunning
, TRUE
);
865 if (AfxBeginThread(RebaseThreadEntry
, this)==NULL
)
867 InterlockedExchange(&m_bThreadRunning
, FALSE
);
868 CMessageBox::Show(NULL
, _T("Create Rebase Thread Fail"), _T("TortoiseGit"), MB_OK
| MB_ICONERROR
);
872 int CRebaseDlg::CheckNextCommitIsSquash()
875 if(m_CommitList
.m_IsOldFirst
)
876 index
=m_CurrentRebaseIndex
+1;
878 index
=m_CurrentRebaseIndex
-1;
885 if(index
>= m_CommitList
.GetItemCount())
888 curRev
=(GitRev
*)m_CommitList
.m_arShownList
[index
];
890 if( curRev
->m_Action
&CTGitPath::LOGACTIONS_REBASE_SQUASH
)
892 if( curRev
->m_Action
&CTGitPath::LOGACTIONS_REBASE_SKIP
)
894 if(m_CommitList
.m_IsOldFirst
)
901 }while(curRev
->m_Action
&CTGitPath::LOGACTIONS_REBASE_SKIP
);
906 int CRebaseDlg::GoNext()
908 if(m_CommitList
.m_IsOldFirst
)
909 m_CurrentRebaseIndex
++;
911 m_CurrentRebaseIndex
--;
915 int CRebaseDlg::StateAction()
917 switch(this->m_RebaseStage
)
920 case CHOOSE_COMMIT_PICK_MODE
:
923 m_RebaseStage
= REBASE_START
;
930 void CRebaseDlg::SetContinueButtonText()
933 switch(this->m_RebaseStage
)
936 case CHOOSE_COMMIT_PICK_MODE
:
937 if(this->m_IsFastForward
)
938 Text
= _T("Start(FastFwd)");
944 case REBASE_CONTINUE
:
945 case REBASE_SQUASH_CONFLICT
:
946 Text
= _T("Continue");
949 case REBASE_CONFLICT
:
956 case REBASE_SQUASH_EDIT
:
969 this->GetDlgItem(IDC_REBASE_CONTINUE
)->SetWindowText(Text
);
972 void CRebaseDlg::SetControlEnable()
974 switch(this->m_RebaseStage
)
977 case CHOOSE_COMMIT_PICK_MODE
:
979 this->GetDlgItem(IDC_PICK_ALL
)->EnableWindow(TRUE
);
980 this->GetDlgItem(IDC_EDIT_ALL
)->EnableWindow(TRUE
);
981 this->GetDlgItem(IDC_SQUASH_ALL
)->EnableWindow(TRUE
);
984 this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH
)->EnableWindow(TRUE
);
985 this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM
)->EnableWindow(TRUE
);
987 //this->m_CommitList.m_IsEnableRebaseMenu=TRUE;
988 this->m_CommitList
.m_ContextMenuMask
|= m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_PICK
)|
989 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_SQUASH
)|
990 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_EDIT
)|
991 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_SKIP
);
995 case REBASE_CONTINUE
:
998 case REBASE_CONFLICT
:
1000 case REBASE_SQUASH_CONFLICT
:
1002 this->GetDlgItem(IDC_PICK_ALL
)->EnableWindow(FALSE
);
1003 this->GetDlgItem(IDC_EDIT_ALL
)->EnableWindow(FALSE
);
1004 this->GetDlgItem(IDC_SQUASH_ALL
)->EnableWindow(FALSE
);
1005 this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH
)->EnableWindow(FALSE
);
1006 this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM
)->EnableWindow(FALSE
);
1007 //this->m_CommitList.m_IsEnableRebaseMenu=FALSE;
1008 this->m_CommitList
.m_ContextMenuMask
&= ~(m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_PICK
)|
1009 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_SQUASH
)|
1010 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_EDIT
)|
1011 m_CommitList
.GetContextMenuBit(CGitLogListBase::ID_REBASE_SKIP
));
1013 if( m_RebaseStage
== REBASE_DONE
&& (!this->m_PostButtonText
.IsEmpty()) )
1015 this->GetDlgItem(IDC_STATUS_STATIC
)->ShowWindow(SW_HIDE
);
1016 this->GetDlgItem(IDC_REBASE_POST_BUTTON
)->ShowWindow(SW_SHOWNORMAL
);
1017 this->GetDlgItem(IDC_REBASE_POST_BUTTON
)->SetWindowText(this->m_PostButtonText
);
1022 if(m_bThreadRunning
)
1024 this->GetDlgItem(IDC_REBASE_CONTINUE
)->EnableWindow(FALSE
);
1025 this->GetDlgItem(IDC_REBASE_ABORT
)->EnableWindow(FALSE
);
1029 this->GetDlgItem(IDC_REBASE_CONTINUE
)->EnableWindow(TRUE
);
1030 this->GetDlgItem(IDC_REBASE_ABORT
)->EnableWindow(TRUE
);
1034 void CRebaseDlg::UpdateProgress()
1039 if(m_CommitList
.m_IsOldFirst
)
1040 index
= m_CurrentRebaseIndex
+1;
1042 index
= m_CommitList
.GetItemCount()-m_CurrentRebaseIndex
;
1044 m_ProgressBar
.SetRange(1,m_CommitList
.GetItemCount());
1045 m_ProgressBar
.SetPos(index
);
1047 if(m_CurrentRebaseIndex
>=0 && m_CurrentRebaseIndex
< m_CommitList
.GetItemCount())
1050 text
.Format(_T("Rebasing...(%d/%d)"),index
,m_CommitList
.GetItemCount());
1051 m_CtrlStatusText
.SetWindowText(text
);
1055 GitRev
*prevRev
=NULL
, *curRev
=NULL
;
1057 if( m_CurrentRebaseIndex
>= 0 && m_CurrentRebaseIndex
< m_CommitList
.m_arShownList
.GetSize())
1059 curRev
=(GitRev
*)m_CommitList
.m_arShownList
[m_CurrentRebaseIndex
];
1062 for(int i
=0;i
<m_CommitList
.m_arShownList
.GetSize();i
++)
1064 prevRev
=(GitRev
*)m_CommitList
.m_arShownList
[i
];
1065 if(prevRev
->m_Action
& CTGitPath::LOGACTIONS_REBASE_CURRENT
)
1067 prevRev
->m_Action
&= ~ CTGitPath::LOGACTIONS_REBASE_CURRENT
;
1068 m_CommitList
.GetItemRect(i
,&rect
,LVIR_BOUNDS
);
1069 m_CommitList
.InvalidateRect(rect
);
1075 curRev
->m_Action
|= CTGitPath::LOGACTIONS_REBASE_CURRENT
;
1076 m_CommitList
.GetItemRect(m_CurrentRebaseIndex
,&rect
,LVIR_BOUNDS
);
1077 m_CommitList
.InvalidateRect(rect
);
1079 m_CommitList
.EnsureVisible(m_CurrentRebaseIndex
,FALSE
);
1083 void CRebaseDlg::UpdateCurrentStatus()
1085 if( m_CurrentRebaseIndex
< 0 && m_RebaseStage
!= REBASE_DONE
)
1087 if(m_CommitList
.m_IsOldFirst
)
1088 m_RebaseStage
= CRebaseDlg::REBASE_START
;
1090 m_RebaseStage
= CRebaseDlg::REBASE_FINISH
;
1093 if( m_CurrentRebaseIndex
== m_CommitList
.m_arShownList
.GetSize() && m_RebaseStage
!= REBASE_DONE
)
1095 if(m_CommitList
.m_IsOldFirst
)
1096 m_RebaseStage
= CRebaseDlg::REBASE_DONE
;
1098 m_RebaseStage
= CRebaseDlg::REBASE_FINISH
;
1101 SetContinueButtonText();
1106 void CRebaseDlg::AddLogString(CString str
)
1108 this->m_wndOutputRebase
.SendMessage(SCI_SETREADONLY
, FALSE
);
1109 CStringA sTextA
= m_wndOutputRebase
.StringForControl(str
);//CUnicodeUtils::GetUTF8(str);
1110 this->m_wndOutputRebase
.SendMessage(SCI_REPLACESEL
, 0, (LPARAM
)(LPCSTR
)sTextA
);
1111 this->m_wndOutputRebase
.SendMessage(SCI_REPLACESEL
, 0, (LPARAM
)(LPCSTR
)"\n");
1112 this->m_wndOutputRebase
.SendMessage(SCI_SETREADONLY
, TRUE
);
1115 int CRebaseDlg::GetCurrentCommitID()
1117 if(m_CommitList
.m_IsOldFirst
)
1119 return this->m_CurrentRebaseIndex
+1;
1123 return m_CommitList
.GetItemCount()-m_CurrentRebaseIndex
;
1127 int CRebaseDlg::DoRebase()
1130 if(m_CurrentRebaseIndex
<0)
1132 if(m_CurrentRebaseIndex
>= m_CommitList
.GetItemCount() )
1135 GitRev
*pRev
= (GitRev
*)m_CommitList
.m_arShownList
[m_CurrentRebaseIndex
];
1136 int mode
=pRev
->m_Action
& CTGitPath::LOGACTIONS_REBASE_MODE_MASK
;
1139 if( mode
== CTGitPath::LOGACTIONS_REBASE_SKIP
)
1141 pRev
->m_Action
|= CTGitPath::LOGACTIONS_REBASE_DONE
;
1145 if( mode
!= CTGitPath::LOGACTIONS_REBASE_PICK
)
1147 this->m_SquashMessage
+= pRev
->m_Subject
;
1148 this->m_SquashMessage
+= _T("\n");
1149 this->m_SquashMessage
+= pRev
->m_Body
;
1152 this->m_SquashMessage
.Empty();
1154 if(mode
== CTGitPath::LOGACTIONS_REBASE_SQUASH
)
1155 nocommit
=_T(" --no-commit ");
1158 log
.Format(_T("%s %d:%s"),CTGitPath::GetActionName(mode
),this->GetCurrentCommitID(),pRev
->m_CommitHash
);
1160 AddLogString(pRev
->m_Subject
);
1161 cmd
.Format(_T("git.exe cherry-pick %s %s"),nocommit
,pRev
->m_CommitHash
);
1163 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
1167 if(g_Git
.ListConflictFile(list
))
1169 AddLogString(_T("Get conflict files fail"));
1172 if(list
.GetCount() == 0 )
1174 if(mode
== CTGitPath::LOGACTIONS_REBASE_PICK
)
1176 pRev
->m_Action
|= CTGitPath::LOGACTIONS_REBASE_DONE
;
1179 if(mode
== CTGitPath::LOGACTIONS_REBASE_EDIT
)
1181 this->m_RebaseStage
= REBASE_EDIT
;
1182 return -1; // Edit return -1 to stop rebase.
1185 if(CheckNextCommitIsSquash())
1187 // let user edit last commmit message
1188 this->m_RebaseStage
= REBASE_SQUASH_EDIT
;
1192 if(mode
== CTGitPath::LOGACTIONS_REBASE_SQUASH
)
1193 m_RebaseStage
= REBASE_SQUASH_CONFLICT
;
1195 m_RebaseStage
= REBASE_CONFLICT
;
1201 if(mode
== CTGitPath::LOGACTIONS_REBASE_PICK
)
1203 pRev
->m_Action
|= CTGitPath::LOGACTIONS_REBASE_DONE
;
1206 if(mode
== CTGitPath::LOGACTIONS_REBASE_EDIT
)
1208 this->m_RebaseStage
= REBASE_EDIT
;
1209 return -1; // Edit return -1 to stop rebase.
1213 if(CheckNextCommitIsSquash())
1215 // let user edit last commmit message
1216 this->m_RebaseStage
= REBASE_SQUASH_EDIT
;
1224 BOOL
CRebaseDlg::IsEnd()
1226 if(m_CommitList
.m_IsOldFirst
)
1227 return m_CurrentRebaseIndex
>= this->m_CommitList
.GetItemCount();
1229 return m_CurrentRebaseIndex
<0;
1232 int CRebaseDlg::RebaseThread()
1237 if( m_RebaseStage
== REBASE_START
)
1239 if( this->StartRebase() )
1241 InterlockedExchange(&m_bThreadRunning
, FALSE
);
1245 m_RebaseStage
= REBASE_CONTINUE
;
1247 }else if( m_RebaseStage
== REBASE_CONTINUE
)
1253 m_RebaseStage
= REBASE_FINISH
;
1265 }else if( m_RebaseStage
== REBASE_FINISH
)
1268 m_RebaseStage
= REBASE_DONE
;
1275 this->PostMessage(MSG_REBASE_UPDATE_UI
);
1276 //this->UpdateCurrentStatus();
1279 InterlockedExchange(&m_bThreadRunning
, FALSE
);
1280 this->PostMessage(MSG_REBASE_UPDATE_UI
);
1284 void CRebaseDlg::ListConflictFile()
1286 this->m_FileListCtrl
.Clear();
1291 this->m_FileListCtrl
.GetStatus(&list
,true);
1292 this->m_FileListCtrl
.Show(CTGitPath::LOGACTIONS_UNMERGED
|CTGitPath::LOGACTIONS_MODIFIED
|CTGitPath::LOGACTIONS_ADDED
|CTGitPath::LOGACTIONS_DELETED
,
1293 CTGitPath::LOGACTIONS_UNMERGED
);
1294 if( this->m_FileListCtrl
.GetItemCount() == 0 )
1300 LRESULT
CRebaseDlg::OnRebaseUpdateUI(WPARAM
,LPARAM
)
1302 UpdateCurrentStatus();
1303 if(m_CurrentRebaseIndex
<0)
1305 if(m_CurrentRebaseIndex
>= m_CommitList
.GetItemCount() )
1307 GitRev
*curRev
=(GitRev
*)m_CommitList
.m_arShownList
[m_CurrentRebaseIndex
];
1309 switch(m_RebaseStage
)
1311 case REBASE_CONFLICT
:
1312 case REBASE_SQUASH_CONFLICT
:
1314 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_CONFLICT
);
1315 this->m_LogMessageCtrl
.SetText(curRev
->m_Subject
+_T("\n")+curRev
->m_Body
);
1318 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_MESSAGE
);
1319 this->m_LogMessageCtrl
.SetText(curRev
->m_Subject
+_T("\n")+curRev
->m_Body
);
1321 case REBASE_SQUASH_EDIT
:
1322 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_MESSAGE
);
1323 this->m_LogMessageCtrl
.SetText(this->m_SquashMessage
);
1326 this->m_ctrlTabCtrl
.SetActiveTab(REBASE_TAB_LOG
);
1330 void CRebaseDlg::OnCancel()
1334 void CRebaseDlg::OnBnClickedAbort()
1337 if(m_OrigUpstreamHash
.IsEmpty())
1339 __super::OnCancel();
1342 if(m_RebaseStage
== CHOOSE_BRANCH
|| m_RebaseStage
== CHOOSE_COMMIT_PICK_MODE
)
1347 if(CMessageBox::Show(NULL
,_T("Are you sure you want to abort the rebase process?"),_T("TortoiseGit"),MB_YESNO
) != IDYES
)
1350 if(this->m_IsFastForward
)
1352 cmd
.Format(_T("git.exe reset --hard %s"),this->m_OrigBranchHash
.Left(40));
1353 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
1358 __super::OnCancel();
1361 cmd
.Format(_T("git.exe checkout -f %s"),this->m_UpstreamCtrl
.GetString());
1362 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
1368 cmd
.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash
.Left(40));
1369 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
1375 if(this->m_IsCherryPick
) //there are not "branch" at cherry pick mode
1378 cmd
.Format(_T("git checkout -f %s"),this->m_BranchCtrl
.GetString());
1379 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
1385 cmd
.Format(_T("git.exe reset --hard %s"),this->m_OrigBranchHash
.Left(40));
1386 if(g_Git
.Run(cmd
,&out
,CP_UTF8
))
1391 __super::OnCancel();
1394 void CRebaseDlg::OnBnClickedButtonBrowse()
1396 if(CBrowseRefsDlg::PickRefForCombo(&m_UpstreamCtrl
, gPickRef_NoTag
))
1397 OnCbnSelchangeUpstream();
1400 void CRebaseDlg::OnBnClickedRebaseCheckForce()
1402 // TODO: Add your control notification handler code here
1404 this->FetchLogList();
1407 void CRebaseDlg::OnStnClickedStatusStatic()
1409 // TODO: Add your control notification handler code here
1412 void CRebaseDlg::OnBnClickedRebasePostButton()
1414 // TODO: Add your control notification handler code here
1415 this->m_Upstream
=this->m_UpstreamCtrl
.GetString();
1416 this->m_Branch
=this->m_BranchCtrl
.GetString();
1418 this->EndDialog(IDC_REBASE_POST_BUTTON
);