X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=src%2FTortoiseProc%2FRebaseDlg.cpp;h=51b15de4d800bff3a201329873e583d8c96f2204;hb=8b84d390c56b1d89df18de4db7bcc0c8ada4ddcd;hp=cab8be1c89d89aff7d994b89e36422df6e4f98e7;hpb=85cc56c0f7aa31bf8c0127a933e183e9f928f519;p=tortoisegit%2FTortoiseGitJp.git diff --git a/src/TortoiseProc/RebaseDlg.cpp b/src/TortoiseProc/RebaseDlg.cpp index cab8be1..51b15de 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) @@ -20,6 +22,9 @@ CRebaseDlg::CRebaseDlg(CWnd* pParent /*=NULL*/) m_RebaseStage=CHOOSE_BRANCH; m_CurrentRebaseIndex=-1; m_bThreadRunning =FALSE; + this->m_IsCherryPick = FALSE; + m_bForce=FALSE; + m_IsFastForward=FALSE; } CRebaseDlg::~CRebaseDlg() @@ -38,6 +43,7 @@ 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); } @@ -53,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() @@ -71,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() @@ -86,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"); @@ -127,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); @@ -172,18 +186,46 @@ BOOL CRebaseDlg::OnInitDialog() // m_CommitList.m_IsOldFirst = TRUE; m_CommitList.m_IsRebaseReplaceGraph = TRUE; - m_CommitList.DeleteAllItems(); m_CommitList.InsertGitColumn(); - FetchLogList(); - SetContinueButtonText(); 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); + this->m_BranchCtrl.EnableWindow(FALSE); + this->m_UpstreamCtrl.EnableWindow(FALSE); + this->SetWindowText(_T("Cherry Pick")); + this->m_CommitList.StartFilter(); + + }else + { + SetContinueButtonText(); + m_CommitList.DeleteAllItems(); + FetchLogList(); + } + m_CommitList.m_ContextMenuMask &= ~(m_CommitList.GetContextMenuBit(CGitLogListBase::ID_CHERRY_PICK)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_SWITCHTOREV)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_RESET)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTREV)| - m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REVERTTOREV)); + m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_TO_VERSION)| + 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; } @@ -343,6 +385,29 @@ void CRebaseDlg::LoadBranchInfo() AddBranchToolTips(&m_BranchCtrl); AddBranchToolTips(&m_UpstreamCtrl); + if(!m_Upstream.IsEmpty()) + { + 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() @@ -357,12 +422,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 ) @@ -383,7 +518,7 @@ void CRebaseDlg::FetchLogList() { m_CommitList.m_logEntries[i].m_Action = CTGitPath::LOGACTIONS_REBASE_PICK; } - + m_CommitList.Invalidate(); if(m_CommitList.m_IsOldFirst) @@ -391,6 +526,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) @@ -438,18 +575,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); - if(g_Git.Run(cmd,&out,CP_UTF8)) - return -1; + if(!this->m_IsCherryPick) + { + //Todo call comment_for_reflog + cmd.Format(_T("git.exe checkout %s"),this->m_BranchCtrl.GetString()); + this->AddLogString(cmd); - this->AddLogString(out); + if(g_Git.Run(cmd,&out,CP_UTF8)) + return -1; + + this->AddLogString(out); + } cmd=_T("git.exe rev-parse --verify HEAD"); if(g_Git.Run(cmd,&out,CP_UTF8)) @@ -468,32 +610,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() @@ -512,8 +661,71 @@ 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 == REBASE_DONE) + { + OnOK(); + } + + if( this->m_IsFastForward ) + { + 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; + } + CString cmd,out; + 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; + } + AddLogString(out); + AddLogString(_T("Done")); + m_RebaseStage = REBASE_DONE; + UpdateCurrentStatus(); + return; + + } if( m_RebaseStage == CHOOSE_BRANCH|| m_RebaseStage == CHOOSE_COMMIT_PICK_MODE ) { if(CheckRebaseCondition()) @@ -521,21 +733,12 @@ void CRebaseDlg::OnBnClickedContinue() m_RebaseStage = REBASE_START; } + if( m_RebaseStage == REBASE_FINISH ) { - CString cmd,out; - cmd.Format(_T("git branch -f %s"),this->m_BranchCtrl.GetString()); - if(g_Git.Run(cmd,&out,CP_UTF8)) - { - AddLogString(out); + if(FinishRebase()) return ; - } - cmd.Format(_T("git reset --hard %s"),this->m_OrigUpstreamHash); - if(g_Git.Run(cmd,&out,CP_UTF8)) - { - AddLogString(out); - return ; - } + OnOK(); } @@ -661,6 +864,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 ) @@ -672,12 +880,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); @@ -715,7 +918,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: @@ -739,6 +945,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); } @@ -753,8 +963,11 @@ void CRebaseDlg::SetControlEnable() this->GetDlgItem(IDC_PICK_ALL)->EnableWindow(TRUE); this->GetDlgItem(IDC_EDIT_ALL)->EnableWindow(TRUE); this->GetDlgItem(IDC_SQUASH_ALL)->EnableWindow(TRUE); - this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH)->EnableWindow(TRUE); - this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM)->EnableWindow(TRUE); + if(!m_IsCherryPick) + { + this->GetDlgItem(IDC_REBASE_COMBOXEX_BRANCH)->EnableWindow(TRUE); + this->GetDlgItem(IDC_REBASE_COMBOXEX_UPSTREAM)->EnableWindow(TRUE); + } //this->m_CommitList.m_IsEnableRebaseMenu=TRUE; this->m_CommitList.m_ContextMenuMask |= m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_PICK)| m_CommitList.GetContextMenuBit(CGitLogListBase::ID_REBASE_SQUASH)| @@ -769,6 +982,7 @@ 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); @@ -779,6 +993,13 @@ void CRebaseDlg::SetControlEnable() 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_PostButtonText.IsEmpty()) ) + { + this->GetDlgItem(IDC_STATUS_STATIC)->ShowWindow(SW_HIDE); + this->GetDlgItem(IDC_REBASE_POST_BUTTON)->ShowWindow(SW_SHOWNORMAL); + this->GetDlgItem(IDC_REBASE_POST_BUTTON)->SetWindowText(this->m_PostButtonText); + } break; } @@ -807,7 +1028,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()); @@ -845,7 +1066,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; @@ -853,12 +1074,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(); @@ -940,8 +1161,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 @@ -965,7 +1188,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()) @@ -1009,18 +1235,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(); } @@ -1037,8 +1272,9 @@ void CRebaseDlg::ListConflictFile() CTGitPath path; list.AddPath(path); - this->m_FileListCtrl.GetStatus(list,true); - this->m_FileListCtrl.Show(CTGitPath::LOGACTIONS_UNMERGED|CTGitPath::LOGACTIONS_MODIFIED,CTGitPath::LOGACTIONS_UNMERGED); + this->m_FileListCtrl.GetStatus(&list,true); + 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 ) { @@ -1084,10 +1320,34 @@ void CRebaseDlg::OnBnClickedAbort() CString cmd,out; if(m_OrigUpstreamHash.IsEmpty()) { - this->OnCancel(); + __super::OnCancel(); } - if(CMessageBox::Show(NULL,_T("Are you sure abort rebase"),_T("TortoiseGit"),MB_YESNO) != IDYES) + + if(m_RebaseStage == CHOOSE_BRANCH || m_RebaseStage== CHOOSE_COMMIT_PICK_MODE) + { + return; + } + + 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)) @@ -1096,6 +1356,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)) { @@ -1103,5 +1366,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); +}