X-Git-Url: http://git.sourceforge.jp/view?p=tortoisegit%2FTortoiseGitJp.git;a=blobdiff_plain;f=src%2FTortoiseProc%2FRebaseDlg.cpp;h=0e6d8eb6e56e9e4e57fa7d607c0915155e37576b;hp=4cdfcdf48bca7c4a5c162b08ebd695e377f70ccf;hb=c791ac1c4a11af8ab20326978682d5c80bc9d3a0;hpb=42cd75f4c81670ad3b9af0d69e387e1ec2f48895 diff --git a/src/TortoiseProc/RebaseDlg.cpp b/src/TortoiseProc/RebaseDlg.cpp index 4cdfcdf..0e6d8eb 100644 --- a/src/TortoiseProc/RebaseDlg.cpp +++ b/src/TortoiseProc/RebaseDlg.cpp @@ -7,6 +7,8 @@ #include "AppUtils.h" #include "MessageBox.h" #include "UnicodeUtils.h" +#include "BrowseRefsDlg.h" +#include "ProgressDlg.h" // CRebaseDlg dialog IMPLEMENT_DYNAMIC(CRebaseDlg, CResizableStandAloneDialog) @@ -21,6 +23,8 @@ CRebaseDlg::CRebaseDlg(CWnd* pParent /*=NULL*/) m_CurrentRebaseIndex=-1; m_bThreadRunning =FALSE; this->m_IsCherryPick = FALSE; + m_bForce=FALSE; + m_IsFastForward=FALSE; } CRebaseDlg::~CRebaseDlg() @@ -39,7 +43,8 @@ void CRebaseDlg::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX,IDC_COMMIT_LIST,m_CommitList); DDX_Control(pDX,IDC_REBASE_COMBOXEX_BRANCH, this->m_BranchCtrl); DDX_Control(pDX,IDC_REBASE_COMBOXEX_UPSTREAM, this->m_UpstreamCtrl); - + DDX_Check(pDX, IDC_REBASE_CHECK_FORCE,m_bForce); + DDX_Control(pDX,IDC_REBASE_POST_BUTTON,m_PostButton); } @@ -54,6 +59,10 @@ BEGIN_MESSAGE_MAP(CRebaseDlg, CResizableStandAloneDialog) ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_BRANCH, &CRebaseDlg::OnCbnSelchangeBranch) ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_UPSTREAM, &CRebaseDlg::OnCbnSelchangeUpstream) ON_MESSAGE(MSG_REBASE_UPDATE_UI, OnRebaseUpdateUI) + ON_BN_CLICKED(IDC_BUTTON_BROWSE, &CRebaseDlg::OnBnClickedButtonBrowse) + ON_BN_CLICKED(IDC_REBASE_CHECK_FORCE, &CRebaseDlg::OnBnClickedRebaseCheckForce) + ON_STN_CLICKED(IDC_STATUS_STATIC, &CRebaseDlg::OnStnClickedStatusStatic) + ON_BN_CLICKED(IDC_REBASE_POST_BUTTON, &CRebaseDlg::OnBnClickedRebasePostButton) END_MESSAGE_MAP() void CRebaseDlg::AddRebaseAnchor() @@ -72,7 +81,11 @@ void CRebaseDlg::AddRebaseAnchor() AddAnchor(IDC_REBASE_COMBOXEX_BRANCH,TOP_LEFT); AddAnchor(IDC_REBASE_STATIC_UPSTREAM,TOP_LEFT); AddAnchor(IDC_REBASE_STATIC_BRANCH,TOP_LEFT); + AddAnchor(IDHELP, BOTTOM_RIGHT); + AddAnchor(IDC_REBASE_CHECK_FORCE,TOP_RIGHT); + AddAnchor(IDC_REBASE_POST_BUTTON,BOTTOM_LEFT); + this->AddOthersToAnchor(); } BOOL CRebaseDlg::OnInitDialog() @@ -87,13 +100,8 @@ BOOL CRebaseDlg::OnInitDialog() CWnd *pwnd=this->GetDlgItem(IDC_REBASE_DUMY_TAB); pwnd->GetWindowRect(&rectDummy); + this->ScreenToClient(rectDummy); - rectDummy.top-=20; - rectDummy.bottom-=20; - - rectDummy.left-=5; - rectDummy.right-=5; - if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_REBASE_TAB)) { TRACE0("Failed to create output tab window\n"); @@ -128,8 +136,13 @@ BOOL CRebaseDlg::OnInitDialog() m_wndOutputRebase.Call(SCI_SETREADONLY, TRUE); m_tooltips.Create(this); + + m_tooltips.AddTool(IDC_REBASE_CHECK_FORCE,IDS_REBASE_FORCE_TT); + m_tooltips.AddTool(IDC_REBASE_ABORT,IDS_REBASE_ABORT_TT); + + - m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |IDS_STATUSLIST_COLADD|IDS_STATUSLIST_COLDEL , _T("RebaseDlg"),(SVNSLC_POPALL ^ SVNSLC_POPCOMMIT),false); + m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("RebaseDlg"),(SVNSLC_POPALL ^ SVNSLC_POPCOMMIT),false); m_ctrlTabCtrl.AddTab(&m_FileListCtrl,_T("Conflict File")); m_ctrlTabCtrl.AddTab(&m_LogMessageCtrl,_T("Commit Message"),1); @@ -177,6 +190,14 @@ BOOL CRebaseDlg::OnInitDialog() this->SetControlEnable(); + if(!this->m_PreCmd.IsEmpty()) + { + CProgressDlg progress; + progress.m_GitCmd=m_PreCmd; + progress.m_bAutoCloseOnSuccess=true; + progress.DoModal(); + } + if(m_IsCherryPick) { this->m_BranchCtrl.SetCurSel(-1); @@ -197,7 +218,14 @@ BOOL CRebaseDlg::OnInitDialog() m_CommitList.GetContextMenuBit(CGitLogListBase::ID_RESET)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTREV)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_TO_VERSION)| - m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTTOREV)); + m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTTOREV)| + m_CommitList.GetContextMenuBit(CGitLogListBase::ID_COMBINE_COMMIT)); + + if(m_CommitList.m_IsOldFirst) + this->m_CurrentRebaseIndex = -1; + else + this->m_CurrentRebaseIndex = m_CommitList.m_logEntries.size(); + return TRUE; } @@ -284,6 +312,7 @@ void CRebaseDlg::DoSize(int delta) CSplitterControl::ChangePos(GetDlgItem(IDC_SQUASH_ALL),0,delta); CSplitterControl::ChangePos(GetDlgItem(IDC_PICK_ALL),0,delta); CSplitterControl::ChangePos(GetDlgItem(IDC_EDIT_ALL),0,delta); + CSplitterControl::ChangePos(GetDlgItem(IDC_REBASE_CHECK_FORCE),0,delta); this->AddRebaseAnchor(); // adjust the minimum size of the dialog to prevent the resizing from @@ -362,6 +391,24 @@ void CRebaseDlg::LoadBranchInfo() m_UpstreamCtrl.AddString(m_Upstream); m_UpstreamCtrl.SetCurSel(m_UpstreamCtrl.GetCount()-1); } + else + { + //Select pull-remote from current branch + CString currentBranch = g_Git.GetSymbolicRef(); + CString configName; + configName.Format(L"branch.%s.remote", currentBranch); + CString pullRemote = g_Git.GetConfigValue(configName); + + //Select pull-branch from current branch + configName.Format(L"branch.%s.merge", currentBranch); + CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName)); + + CString defaultUpstream; + defaultUpstream.Format(L"remotes/%s/%s", pullRemote, pullBranch); + int found = m_UpstreamCtrl.FindStringExact(0, defaultUpstream); + if(found >= 0) + m_UpstreamCtrl.SetCurSel(found); + } } void CRebaseDlg::OnCbnSelchangeBranch() @@ -376,12 +423,82 @@ void CRebaseDlg::OnCbnSelchangeUpstream() void CRebaseDlg::FetchLogList() { + CString base,hash; + CString cmd; + m_IsFastForward=FALSE; + cmd.Format(_T("git.exe merge-base %s %s"), m_UpstreamCtrl.GetString(),m_BranchCtrl.GetString()); + if(g_Git.Run(cmd,&base,CP_ACP)) + { + CMessageBox::Show(NULL,base,_T("TortoiseGit"),MB_OK|MB_ICONERROR); + return; + } + base=base.Left(40); + + hash=g_Git.GetHash(m_BranchCtrl.GetString()); + + if(hash == g_Git.GetHash(this->m_UpstreamCtrl.GetString())) + { + m_CommitList.Clear(); + CString text,fmt; + fmt.LoadString(IDS_REBASE_EQUAL_FMT); + text.Format(fmt,m_BranchCtrl.GetString(),this->m_UpstreamCtrl.GetString()); + + m_CommitList.ShowText(text); + this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(false); + return; + } + + hash=hash.Left(40); + + if(hash == base ) + { + //fast forword + this->m_IsFastForward=TRUE; + + m_CommitList.Clear(); + CString text,fmt; + fmt.LoadString(IDS_REBASE_FASTFORWARD_FMT); + text.Format(fmt,m_BranchCtrl.GetString(),this->m_UpstreamCtrl.GetString(), + m_BranchCtrl.GetString(),this->m_UpstreamCtrl.GetString()); + + m_CommitList.ShowText(text); + this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(true); + SetContinueButtonText(); + + return ; + } + + hash.Empty(); + + if(!this->m_bForce) + { + cmd.Format(_T("git.exe rev-parse %s"), m_UpstreamCtrl.GetString()); + if( g_Git.Run(cmd,&hash,CP_ACP)) + { + CMessageBox::Show(NULL,base,_T("TortoiseGit"),MB_OK|MB_ICONERROR); + return; + } + hash=hash.Left(40); + + if( base == hash ) + { + m_CommitList.Clear(); + CString text,fmt; + fmt.LoadString(IDS_REBASE_UPTODATE_FMT); + text.Format(fmt,m_BranchCtrl.GetString()); + m_CommitList.ShowText(text); + this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(m_CommitList.GetItemCount()); + SetContinueButtonText(); + return; + } + } + m_CommitList.Clear(); this->m_CommitList.FillGitLog(NULL,0,&m_UpstreamCtrl.GetString(),&m_BranchCtrl.GetString()); if( m_CommitList.GetItemCount() == 0 ) - m_CommitList.ShowText(_T("Nothing Rebase")); + m_CommitList.ShowText(_T("Nothing to Rebase")); - CString hash=g_Git.GetHash(m_UpstreamCtrl.GetString()); + hash=g_Git.GetHash(m_UpstreamCtrl.GetString()); #if 0 if(m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash.size() >=0 ) @@ -402,7 +519,7 @@ void CRebaseDlg::FetchLogList() { m_CommitList.m_logEntries[i].m_Action = CTGitPath::LOGACTIONS_REBASE_PICK; } - + m_CommitList.Invalidate(); if(m_CommitList.m_IsOldFirst) @@ -410,6 +527,8 @@ void CRebaseDlg::FetchLogList() else this->m_CurrentRebaseIndex = m_CommitList.m_logEntries.size(); + this->GetDlgItem(IDC_REBASE_CONTINUE)->EnableWindow(m_CommitList.GetItemCount()); + SetContinueButtonText(); } void CRebaseDlg::AddBranchToolTips(CHistoryCombo *pBranch) @@ -457,18 +576,23 @@ int CRebaseDlg::CheckRebaseCondition() return -1; //Todo call pre_rebase_hook + return 0; } int CRebaseDlg::StartRebase() { CString cmd,out; - //Todo call comment_for_reflog - cmd.Format(_T("git.exe checkout %s"),this->m_BranchCtrl.GetString()); - this->AddLogString(cmd); + m_FileListCtrl.m_bIsRevertTheirMy = !m_IsCherryPick; + if(!this->m_IsCherryPick) + { + //Todo call comment_for_reflog + cmd.Format(_T("git.exe checkout %s"),this->m_BranchCtrl.GetString()); + this->AddLogString(cmd); - if(g_Git.Run(cmd,&out,CP_UTF8)) - return -1; + if(g_Git.Run(cmd,&out,CP_UTF8)) + return -1; - this->AddLogString(out); + this->AddLogString(out); + } cmd=_T("git.exe rev-parse --verify HEAD"); if(g_Git.Run(cmd,&out,CP_UTF8)) @@ -487,32 +611,39 @@ int CRebaseDlg::StartRebase() return -1; } - cmd.Format(_T("git.exe update-ref ORIG_HEAD HEAD")); - - cmd.Format(_T("git.exe checkout %s"),this->m_UpstreamCtrl.GetString()); - this->AddLogString(cmd); - - out.Empty(); - if(g_Git.Run(cmd,&out,CP_UTF8)) + if( !this->m_IsCherryPick ) { - return -1; + cmd.Format(_T("git.exe checkout %s"),this->m_UpstreamCtrl.GetString()); + this->AddLogString(cmd); + + out.Empty(); + if(g_Git.Run(cmd,&out,CP_UTF8)) + { + return -1; + } } - cmd.Format(_T("git.exe rev-parse %s"),this->m_UpstreamCtrl.GetString()); - if(g_Git.Run(cmd,&this->m_OrigUpstreamHash,CP_UTF8)) + m_OrigUpstreamHash.Empty(); + m_OrigUpstreamHash= g_Git.GetHash(this->m_UpstreamCtrl.GetString()); + if(m_OrigUpstreamHash.IsEmpty()) { this->AddLogString(m_OrigUpstreamHash); return -1; } - cmd.Format(_T("git.exe rev-parse %s"),this->m_BranchCtrl.GetString()); - if(g_Git.Run(cmd,&this->m_OrigBranchHash,CP_UTF8)) + if( !this->m_IsCherryPick ) { - this->AddLogString(m_OrigBranchHash); - return -1; - } + cmd.Format(_T("git.exe rev-parse %s"),this->m_BranchCtrl.GetString()); + if(g_Git.Run(cmd,&this->m_OrigBranchHash,CP_UTF8)) + { + this->AddLogString(m_OrigBranchHash); + return -1; + } + this->AddLogString(_T("Start Rebase\r\n")); - this->AddLogString(_T("Start Rebase\r\n")); + }else + this->AddLogString(_T("Start Cherry-pick\r\n")); + return 0; } int CRebaseDlg::VerifyNoConflict() @@ -531,30 +662,100 @@ int CRebaseDlg::VerifyNoConflict() return 0; } +int CRebaseDlg::FinishRebase() +{ + if(this->m_IsCherryPick) //cherry pick mode no "branch", working at upstream branch + return 0; + + CString cmd,out; + cmd.Format(_T("git.exe branch -f %s"),this->m_BranchCtrl.GetString()); + if(g_Git.Run(cmd,&out,CP_UTF8)) + { + AddLogString(out); + return -1; + } + out.Empty(); + cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash); + if(g_Git.Run(cmd,&out,CP_UTF8)) + { + AddLogString(out); + return -1; + } + out.Empty(); + cmd.Format(_T("git.exe checkout -f %s"),this->m_BranchCtrl.GetString()); + if(g_Git.Run(cmd,&out,CP_UTF8)) + { + AddLogString(out); + return -1; + } + return 0; +} void CRebaseDlg::OnBnClickedContinue() { - if( m_RebaseStage == CHOOSE_BRANCH|| m_RebaseStage == CHOOSE_COMMIT_PICK_MODE ) + if( m_RebaseStage == REBASE_DONE) { - if(CheckRebaseCondition()) - return ; - m_RebaseStage = REBASE_START; + OnOK(); + return; } - if( m_RebaseStage == REBASE_FINISH ) + if( this->m_IsFastForward ) { CString cmd,out; - cmd.Format(_T("git branch -f %s"),this->m_BranchCtrl.GetString()); - if(g_Git.Run(cmd,&out,CP_UTF8)) + CString oldbranch = g_Git.GetCurrentBranch(); + if( oldbranch != m_BranchCtrl.GetString() ) { - AddLogString(out); - return ; + cmd.Format(_T("git.exe checkout %s"),m_BranchCtrl.GetString()); + AddLogString(cmd); + if( g_Git.Run(cmd,&out,CP_ACP) ) + { + this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG); + AddLogString(out); + return; + } } - cmd.Format(_T("git reset --hard %s"),this->m_OrigUpstreamHash); - if(g_Git.Run(cmd,&out,CP_UTF8)) + AddLogString(out); + out.Empty(); + m_OrigBranchHash = g_Git.GetHash(m_BranchCtrl.GetString()); + m_OrigUpstreamHash = g_Git.GetHash(this->m_UpstreamCtrl.GetString()); + + if(!g_Git.IsFastForward(this->m_BranchCtrl.GetString(),this->m_UpstreamCtrl.GetString())) { + this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG); + AddLogString(_T("No fast forward\r\nMaybe repository changed")); + return; + } + + cmd.Format(_T("git.exe reset --hard %s"),this->m_UpstreamCtrl.GetString()); + this->AddLogString(CString(_T("Fast forward to "))+m_UpstreamCtrl.GetString()); + + AddLogString(cmd); + this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG); + if(g_Git.Run(cmd,&out,CP_ACP)) + { + AddLogString(_T("Fail")); AddLogString(out); - return ; + return; } + AddLogString(out); + AddLogString(_T("Done")); + m_RebaseStage = REBASE_DONE; + UpdateCurrentStatus(); + return; + + } + if( m_RebaseStage == CHOOSE_BRANCH|| m_RebaseStage == CHOOSE_COMMIT_PICK_MODE ) + { + if(CheckRebaseCondition()) + return ; + m_RebaseStage = REBASE_START; + } + + + if( m_RebaseStage == REBASE_FINISH ) + { + if(FinishRebase()) + return ; + OnOK(); } @@ -680,6 +881,11 @@ int CRebaseDlg::CheckNextCommitIsSquash() GitRev *curRev; do { + if(index<0) + return -1; + if(index>= m_CommitList.GetItemCount()) + return -1; + curRev=(GitRev*)m_CommitList.m_arShownList[index]; if( curRev->m_Action&CTGitPath::LOGACTIONS_REBASE_SQUASH ) @@ -691,12 +897,7 @@ int CRebaseDlg::CheckNextCommitIsSquash() else index--; }else - return -1; - - if(index<0) - return -1; - if(index>= m_CommitList.GetItemCount()) - return -1; + return -1; }while(curRev->m_Action&CTGitPath::LOGACTIONS_REBASE_SKIP); @@ -734,7 +935,10 @@ void CRebaseDlg::SetContinueButtonText() { case CHOOSE_BRANCH: case CHOOSE_COMMIT_PICK_MODE: - Text = _T("Start"); + if(this->m_IsFastForward) + Text = _T("Start(FastFwd)"); + else + Text = _T("Start"); break; case REBASE_START: @@ -758,6 +962,10 @@ void CRebaseDlg::SetContinueButtonText() case REBASE_FINISH: Text = _T("Finish"); break; + + case REBASE_DONE: + Text = _T("Done"); + break; } this->GetDlgItem(IDC_REBASE_CONTINUE)->SetWindowText(Text); } @@ -772,10 +980,12 @@ void CRebaseDlg::SetControlEnable() this->GetDlgItem(IDC_PICK_ALL)->EnableWindow(TRUE); this->GetDlgItem(IDC_EDIT_ALL)->EnableWindow(TRUE); this->GetDlgItem(IDC_SQUASH_ALL)->EnableWindow(TRUE); + if(!m_IsCherryPick) { this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH)->EnableWindow(TRUE); this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM)->EnableWindow(TRUE); + this->GetDlgItem(IDC_REBASE_CHECK_FORCE)->EnableWindow(TRUE); } //this->m_CommitList.m_IsEnableRebaseMenu=TRUE; this->m_CommitList.m_ContextMenuMask |= m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_PICK)| @@ -791,16 +1001,27 @@ void CRebaseDlg::SetControlEnable() case REBASE_CONFLICT: case REBASE_EDIT: case REBASE_SQUASH_CONFLICT: + case REBASE_DONE: this->GetDlgItem(IDC_PICK_ALL)->EnableWindow(FALSE); this->GetDlgItem(IDC_EDIT_ALL)->EnableWindow(FALSE); this->GetDlgItem(IDC_SQUASH_ALL)->EnableWindow(FALSE); this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH)->EnableWindow(FALSE); this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM)->EnableWindow(FALSE); + this->GetDlgItem(IDC_REBASE_CHECK_FORCE)->EnableWindow(FALSE); //this->m_CommitList.m_IsEnableRebaseMenu=FALSE; this->m_CommitList.m_ContextMenuMask &= ~(m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_PICK)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_SQUASH)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_EDIT)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_SKIP)); + + if( m_RebaseStage == REBASE_DONE && (this->m_PostButtonTexts.GetCount() != 0) ) + { + this->GetDlgItem(IDC_STATUS_STATIC)->ShowWindow(SW_HIDE); + this->GetDlgItem(IDC_REBASE_POST_BUTTON)->ShowWindow(SW_SHOWNORMAL); + this->m_PostButton.RemoveAll(); + this->m_PostButton.AddEntries(m_PostButtonTexts); + //this->GetDlgItem(IDC_REBASE_POST_BUTTON)->SetWindowText(this->m_PostButtonText); + } break; } @@ -829,7 +1050,7 @@ void CRebaseDlg::UpdateProgress() m_ProgressBar.SetRange(1,m_CommitList.GetItemCount()); m_ProgressBar.SetPos(index); - if(m_CurrentRebaseIndex>0 && m_CurrentRebaseIndex< m_CommitList.GetItemCount()) + if(m_CurrentRebaseIndex>=0 && m_CurrentRebaseIndex< m_CommitList.GetItemCount()) { CString text; text.Format(_T("Rebasing...(%d/%d)"),index,m_CommitList.GetItemCount()); @@ -867,7 +1088,7 @@ void CRebaseDlg::UpdateProgress() void CRebaseDlg::UpdateCurrentStatus() { - if( m_CurrentRebaseIndex < 0) + if( m_CurrentRebaseIndex < 0 && m_RebaseStage!= REBASE_DONE) { if(m_CommitList.m_IsOldFirst) m_RebaseStage = CRebaseDlg::REBASE_START; @@ -875,12 +1096,12 @@ void CRebaseDlg::UpdateCurrentStatus() m_RebaseStage = CRebaseDlg::REBASE_FINISH; } - if( m_CurrentRebaseIndex == m_CommitList.m_arShownList.GetSize()) + if( m_CurrentRebaseIndex == m_CommitList.m_arShownList.GetSize() && m_RebaseStage!= REBASE_DONE) { if(m_CommitList.m_IsOldFirst) - m_RebaseStage = CRebaseDlg::REBASE_FINISH; + m_RebaseStage = CRebaseDlg::REBASE_DONE; else - m_RebaseStage = CRebaseDlg::REBASE_START; + m_RebaseStage = CRebaseDlg::REBASE_FINISH; } SetContinueButtonText(); @@ -962,8 +1183,10 @@ int CRebaseDlg::DoRebase() return 0; } if(mode == CTGitPath::LOGACTIONS_REBASE_EDIT) + { + this->m_RebaseStage = REBASE_EDIT ; return -1; // Edit return -1 to stop rebase. - + } // Squash Case if(CheckNextCommitIsSquash()) { // no squash @@ -987,7 +1210,10 @@ int CRebaseDlg::DoRebase() return 0; } if(mode == CTGitPath::LOGACTIONS_REBASE_EDIT) + { + this->m_RebaseStage = REBASE_EDIT ; return -1; // Edit return -1 to stop rebase. + } // Squash Case if(CheckNextCommitIsSquash()) @@ -1031,18 +1257,27 @@ int CRebaseDlg::RebaseThread() { ret = 0; m_RebaseStage = REBASE_FINISH; - break; - } - - ret = DoRebase(); + + }else + { + ret = DoRebase(); - if( ret ) - { - break; + if( ret ) + { + break; + } } + }else if( m_RebaseStage == REBASE_FINISH ) + { + FinishRebase(); + m_RebaseStage = REBASE_DONE; + break; + }else + { break; + } this->PostMessage(MSG_REBASE_UPDATE_UI); //this->UpdateCurrentStatus(); } @@ -1059,8 +1294,11 @@ void CRebaseDlg::ListConflictFile() CTGitPath path; list.AddPath(path); + m_FileListCtrl.m_bIsRevertTheirMy = !m_IsCherryPick; + this->m_FileListCtrl.GetStatus(&list,true); - this->m_FileListCtrl.Show(CTGitPath::LOGACTIONS_UNMERGED|CTGitPath::LOGACTIONS_MODIFIED,CTGitPath::LOGACTIONS_UNMERGED); + this->m_FileListCtrl.Show(CTGitPath::LOGACTIONS_UNMERGED|CTGitPath::LOGACTIONS_MODIFIED|CTGitPath::LOGACTIONS_ADDED|CTGitPath::LOGACTIONS_DELETED, + CTGitPath::LOGACTIONS_UNMERGED); if( this->m_FileListCtrl.GetItemCount() == 0 ) { @@ -1114,9 +1352,27 @@ void CRebaseDlg::OnBnClickedAbort() return; } - if(CMessageBox::Show(NULL,_T("Are you sure abort rebase"),_T("TortoiseGit"),MB_YESNO) != IDYES) + if(CMessageBox::Show(NULL,_T("Are you sure you want to abort the rebase process?"),_T("TortoiseGit"),MB_YESNO) != IDYES) return; + if(this->m_IsFastForward) + { + cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigBranchHash.Left(40)); + if(g_Git.Run(cmd,&out,CP_UTF8)) + { + AddLogString(out); + return ; + } + __super::OnCancel(); + return; + } + cmd.Format(_T("git.exe checkout -f %s"),this->m_UpstreamCtrl.GetString()); + if(g_Git.Run(cmd,&out,CP_UTF8)) + { + AddLogString(out); + return ; + } + cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash.Left(40)); if(g_Git.Run(cmd,&out,CP_UTF8)) { @@ -1124,6 +1380,9 @@ void CRebaseDlg::OnBnClickedAbort() return ; } + if(this->m_IsCherryPick) //there are not "branch" at cherry pick mode + return; + cmd.Format(_T("git checkout -f %s"),this->m_BranchCtrl.GetString()); if(g_Git.Run(cmd,&out,CP_UTF8)) { @@ -1131,5 +1390,38 @@ void CRebaseDlg::OnBnClickedAbort() return ; } + cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigBranchHash.Left(40)); + if(g_Git.Run(cmd,&out,CP_UTF8)) + { + AddLogString(out); + return ; + } __super::OnCancel(); } + +void CRebaseDlg::OnBnClickedButtonBrowse() +{ + if(CBrowseRefsDlg::PickRefForCombo(&m_UpstreamCtrl, gPickRef_NoTag)) + OnCbnSelchangeUpstream(); +} + +void CRebaseDlg::OnBnClickedRebaseCheckForce() +{ + // TODO: Add your control notification handler code here + this->UpdateData(); + this->FetchLogList(); +} + +void CRebaseDlg::OnStnClickedStatusStatic() +{ + // TODO: Add your control notification handler code here +} + +void CRebaseDlg::OnBnClickedRebasePostButton() +{ + // TODO: Add your control notification handler code here + this->m_Upstream=this->m_UpstreamCtrl.GetString(); + this->m_Branch=this->m_BranchCtrl.GetString(); + + this->EndDialog(IDC_REBASE_POST_BUTTON); +}