#include "MessageBox.h"\r
#include "UnicodeUtils.h"\r
#include "BrowseRefsDlg.h"\r
+#include "ProgressDlg.h"\r
// CRebaseDlg dialog\r
\r
IMPLEMENT_DYNAMIC(CRebaseDlg, CResizableStandAloneDialog)\r
m_CurrentRebaseIndex=-1;\r
m_bThreadRunning =FALSE;\r
this->m_IsCherryPick = FALSE;\r
+ m_bForce=FALSE;\r
}\r
\r
CRebaseDlg::~CRebaseDlg()\r
DDX_Control(pDX,IDC_COMMIT_LIST,m_CommitList);\r
DDX_Control(pDX,IDC_REBASE_COMBOXEX_BRANCH, this->m_BranchCtrl);\r
DDX_Control(pDX,IDC_REBASE_COMBOXEX_UPSTREAM, this->m_UpstreamCtrl);\r
+ DDX_Check(pDX, IDC_REBASE_CHECK_FORCE,m_bForce);\r
\r
}\r
\r
ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_UPSTREAM, &CRebaseDlg::OnCbnSelchangeUpstream)\r
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
END_MESSAGE_MAP()\r
\r
void CRebaseDlg::AddRebaseAnchor()\r
AddAnchor(IDC_REBASE_COMBOXEX_BRANCH,TOP_LEFT);\r
AddAnchor(IDC_REBASE_STATIC_UPSTREAM,TOP_LEFT);\r
AddAnchor(IDC_REBASE_STATIC_BRANCH,TOP_LEFT);\r
+ AddAnchor(IDHELP, BOTTOM_RIGHT);\r
+ AddAnchor(IDC_REBASE_CHECK_FORCE,TOP_RIGHT);\r
this->AddOthersToAnchor();\r
}\r
\r
m_wndOutputRebase.Call(SCI_SETREADONLY, TRUE);\r
\r
m_tooltips.Create(this);\r
+ \r
+ m_tooltips.AddTool(IDC_REBASE_CHECK_FORCE,IDS_REBASE_FORCE_TT);\r
\r
m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("RebaseDlg"),(SVNSLC_POPALL ^ SVNSLC_POPCOMMIT),false);\r
\r
\r
this->SetControlEnable();\r
\r
+ if(!this->m_PreCmd.IsEmpty())\r
+ {\r
+ CProgressDlg progress;\r
+ progress.m_GitCmd=m_PreCmd;\r
+ progress.m_bAutoCloseOnSuccess=true;\r
+ progress.DoModal();\r
+ }\r
+\r
if(m_IsCherryPick)\r
{\r
this->m_BranchCtrl.SetCurSel(-1);\r
m_UpstreamCtrl.AddString(m_Upstream);\r
m_UpstreamCtrl.SetCurSel(m_UpstreamCtrl.GetCount()-1);\r
}\r
+ else\r
+ {\r
+ //Select pull-remote from current branch\r
+ CString currentBranch = g_Git.GetSymbolicRef();\r
+ CString configName;\r
+ configName.Format(L"branch.%s.remote", currentBranch);\r
+ CString pullRemote = g_Git.GetConfigValue(configName);\r
+\r
+ //Select pull-branch from current branch\r
+ configName.Format(L"branch.%s.merge", currentBranch);\r
+ CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));\r
+\r
+ CString defaultUpstream;\r
+ defaultUpstream.Format(L"remotes/%s/%s", pullRemote, pullBranch);\r
+ int found = m_UpstreamCtrl.FindStringExact(0, defaultUpstream);\r
+ if(found >= 0)\r
+ m_UpstreamCtrl.SetCurSel(found);\r
+ }\r
}\r
\r
void CRebaseDlg::OnCbnSelchangeBranch()\r
\r
void CRebaseDlg::FetchLogList()\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
+ if(!this->m_bForce)\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
+\r
+ cmd.Format(_T("git.exe rev-parse %s"), m_UpstreamCtrl.GetString());\r
+ if( g_Git.Run(cmd,&hash,CP_ACP))\r
+ {\r
+ CMessageBox::Show(NULL,base,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return;\r
+ }\r
+ hash=hash.Left(40);\r
+ \r
+ if( base == hash )\r
+ {\r
+ m_CommitList.Clear();\r
+ CString text,fmt;\r
+ fmt.LoadString(IDS_REBASE_UPTODATE_FMT);\r
+ text.Format(fmt,m_BranchCtrl.GetString());\r
+ m_CommitList.ShowText(text);\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
- 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
- {\r
- if(hash == m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash[0])\r
+ if(m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash.size() >=0 )\r
{\r
- m_CommitList.Clear();\r
- m_CommitList.ShowText(_T("Nothing Rebase"));\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
}\r
- }\r
#endif\r
\r
- m_tooltips.Pop();\r
- AddBranchToolTips(&this->m_BranchCtrl);\r
- AddBranchToolTips(&this->m_UpstreamCtrl);\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
+ 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
+ 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
+ if(m_CommitList.m_IsOldFirst)\r
+ this->m_CurrentRebaseIndex = -1;\r
+ else\r
+ this->m_CurrentRebaseIndex = m_CommitList.m_logEntries.size();\r
\r
+ }\r
+\r
+ this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(m_CommitList.GetItemCount());\r
}\r
\r
void CRebaseDlg::AddBranchToolTips(CHistoryCombo *pBranch)\r
if(CBrowseRefsDlg::PickRefForCombo(&m_UpstreamCtrl, gPickRef_NoTag))\r
OnCbnSelchangeUpstream();\r
}\r
+\r
+void CRebaseDlg::OnBnClickedRebaseCheckForce()\r
+{\r
+ // TODO: Add your control notification handler code here\r
+ this->UpdateData();\r
+ this->FetchLogList();\r
+}\r