m_bThreadRunning =FALSE;\r
this->m_IsCherryPick = FALSE;\r
m_bForce=FALSE;\r
+ m_IsFastForward=FALSE;\r
}\r
\r
CRebaseDlg::~CRebaseDlg()\r
\r
void CRebaseDlg::FetchLogList()\r
{\r
- if(!this->m_bForce)\r
+ CString base,hash;\r
+ CString cmd;\r
+ m_IsFastForward=FALSE;\r
+ cmd.Format(_T("git.exe merge-base %s %s"), m_UpstreamCtrl.GetString(),m_BranchCtrl.GetString());\r
+ if(g_Git.Run(cmd,&base,CP_ACP))\r
{\r
- CString base,hash;\r
- CString cmd;\r
- cmd.Format(_T("git.exe merge-base %s %s"), m_UpstreamCtrl.GetString(),m_BranchCtrl.GetString());\r
- if(g_Git.Run(cmd,&base,CP_ACP))\r
- {\r
- CMessageBox::Show(NULL,base,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
- return;\r
- }\r
- base=base.Left(40);\r
+ CMessageBox::Show(NULL,base,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return;\r
+ }\r
+ base=base.Left(40);\r
+\r
+ hash=g_Git.GetHash(m_BranchCtrl.GetString());\r
+\r
+ hash=hash.Left(40);\r
+ \r
+ if(hash == base )\r
+ {\r
+ //fast forword\r
+ this->m_IsFastForward=TRUE;\r
+\r
+ m_CommitList.Clear();\r
+ CString text,fmt;\r
+ fmt.LoadString(IDS_REBASE_FASTFORWARD_FMT);\r
+ text.Format(fmt,m_BranchCtrl.GetString(),this->m_UpstreamCtrl.GetString(),\r
+ m_BranchCtrl.GetString(),this->m_UpstreamCtrl.GetString());\r
\r
+ m_CommitList.ShowText(text);\r
+ this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(true);\r
+ SetContinueButtonText();\r
+ \r
+ return ;\r
+ }\r
+\r
+ hash.Empty();\r
+\r
+ if(!this->m_bForce)\r
+ {\r
cmd.Format(_T("git.exe rev-parse %s"), m_UpstreamCtrl.GetString());\r
if( g_Git.Run(cmd,&hash,CP_ACP))\r
{\r
text.Format(fmt,m_BranchCtrl.GetString());\r
m_CommitList.ShowText(text);\r
this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(m_CommitList.GetItemCount());\r
+ SetContinueButtonText();\r
return;\r
}\r
}\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
+ 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
this->m_CurrentRebaseIndex = m_CommitList.m_logEntries.size();\r
\r
this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(m_CommitList.GetItemCount());\r
+ SetContinueButtonText();\r
}\r
\r
void CRebaseDlg::AddBranchToolTips(CHistoryCombo *pBranch)\r
}\r
void CRebaseDlg::OnBnClickedContinue()\r
{\r
+ if( m_RebaseStage == REBASE_DONE)\r
+ {\r
+ OnOK();\r
+ }\r
+\r
+ if( this->m_IsFastForward )\r
+ {\r
+ m_OrigBranchHash = g_Git.GetHash(m_BranchCtrl.GetString());\r
+ m_OrigUpstreamHash = g_Git.GetHash(this->m_UpstreamCtrl.GetString());\r
+ \r
+ if(!g_Git.IsFastForward(this->m_BranchCtrl.GetString(),this->m_UpstreamCtrl.GetString()))\r
+ {\r
+ this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG);\r
+ AddLogString(_T("No fast forward\r\nMaybe repository changed"));\r
+ return;\r
+ }\r
+ CString cmd,out;\r
+ cmd.Format(_T("git.exe reset --hard %s"),this->m_UpstreamCtrl.GetString());\r
+ this->AddLogString(CString(_T("Fast forward to "))+m_UpstreamCtrl.GetString());\r
+\r
+ AddLogString(cmd);\r
+ this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG);\r
+ if(g_Git.Run(cmd,&out,CP_ACP))\r
+ {\r
+ AddLogString(_T("Fail"));\r
+ AddLogString(out);\r
+ return;\r
+ }\r
+ AddLogString(out);\r
+ AddLogString(_T("Done"));\r
+ m_RebaseStage = REBASE_DONE;\r
+ UpdateCurrentStatus();\r
+ return;\r
+\r
+ }\r
if( m_RebaseStage == CHOOSE_BRANCH|| m_RebaseStage == CHOOSE_COMMIT_PICK_MODE )\r
{\r
if(CheckRebaseCondition())\r
m_RebaseStage = REBASE_START;\r
}\r
\r
- if( m_RebaseStage == REBASE_DONE)\r
- {\r
- OnOK();\r
- }\r
\r
if( m_RebaseStage == REBASE_FINISH )\r
{\r
{\r
case CHOOSE_BRANCH:\r
case CHOOSE_COMMIT_PICK_MODE:\r
- Text = _T("Start");\r
+ if(this->m_IsFastForward)\r
+ Text = _T("Start(FastFwd)");\r
+ else\r
+ Text = _T("Start");\r
break;\r
\r
case REBASE_START:\r
if(CMessageBox::Show(NULL,_T("Are you sure you want to abort the rebase process?"),_T("TortoiseGit"),MB_YESNO) != IDYES)\r
return;\r
\r
+ if(this->m_IsFastForward)\r
+ {\r
+ cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigBranchHash.Left(40));\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
+ {\r
+ AddLogString(out);\r
+ return ;\r
+ }\r
+ __super::OnCancel();\r
+ return;\r
+ }\r
cmd.Format(_T("git.exe checkout -f %s"),this->m_UpstreamCtrl.GetString());\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r