From b506b74a6a0d21c3e499dda1427dc0516b68ce91 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Wed, 18 Feb 2009 23:05:27 +0800 Subject: [PATCH] RebaseDlg: Edit Basic working. Signed-off-by: Frank Li --- src/Git/TGitPath.cpp | 27 +++++---- src/Git/TGitPath.h | 1 + src/TortoiseProc/RebaseDlg.cpp | 121 +++++++++++++++++++++++++++++++++++------ src/TortoiseProc/RebaseDlg.h | 4 ++ 4 files changed, 124 insertions(+), 29 deletions(-) diff --git a/src/Git/TGitPath.cpp b/src/Git/TGitPath.cpp index f8b5435..a3ddc54 100644 --- a/src/Git/TGitPath.cpp +++ b/src/Git/TGitPath.cpp @@ -1865,32 +1865,35 @@ CTGitPath * CTGitPathList::LookForGitPath(CString path) } return NULL; } - -CString CTGitPath::GetActionName() +CString CTGitPath::GetActionName(int action) { - if(m_Action & CTGitPath::LOGACTIONS_ADDED) + if(action & CTGitPath::LOGACTIONS_ADDED) return _T("Added"); - if(m_Action & CTGitPath::LOGACTIONS_DELETED) + if(action & CTGitPath::LOGACTIONS_DELETED) return _T("Deleted"); - if(m_Action & CTGitPath::LOGACTIONS_UNMERGED) + if(action & CTGitPath::LOGACTIONS_UNMERGED) return _T("Conflict"); - if(m_Action & CTGitPath::LOGACTIONS_MODIFIED) + if(action & CTGitPath::LOGACTIONS_MODIFIED) return _T("Modified"); - if(m_Action & CTGitPath::LOGACTIONS_REPLACED) + if(action & CTGitPath::LOGACTIONS_REPLACED) return _T("Rename"); - if(m_Action & CTGitPath::LOGACTIONS_COPY) + if(action & CTGitPath::LOGACTIONS_COPY) return _T("Copy"); - if(m_Action & CTGitPath::LOGACTIONS_REBASE_EDIT) + if(action & CTGitPath::LOGACTIONS_REBASE_EDIT) return _T("Edit"); - if(m_Action & CTGitPath::LOGACTIONS_REBASE_SQUASH) + if(action & CTGitPath::LOGACTIONS_REBASE_SQUASH) return _T("Squash"); - if(m_Action & CTGitPath::LOGACTIONS_REBASE_PICK) + if(action & CTGitPath::LOGACTIONS_REBASE_PICK) return _T("Pick"); - if(m_Action & CTGitPath::LOGACTIONS_REBASE_SKIP) + if(action & CTGitPath::LOGACTIONS_REBASE_SKIP) return _T("Skip"); return _T("Unknown"); } +CString CTGitPath::GetActionName() +{ + return GetActionName(m_Action); +} int CTGitPathList::GetAction() { diff --git a/src/Git/TGitPath.h b/src/Git/TGitPath.h index 632d8a1..cbb9256 100644 --- a/src/Git/TGitPath.h +++ b/src/Git/TGitPath.h @@ -44,6 +44,7 @@ public: bool m_Checked; int ParserAction(BYTE action); CString GetActionName(); + static CString GetActionName(int action); /** * Set the path as an UTF8 string with forward slashes */ diff --git a/src/TortoiseProc/RebaseDlg.cpp b/src/TortoiseProc/RebaseDlg.cpp index 105d412..e256980 100644 --- a/src/TortoiseProc/RebaseDlg.cpp +++ b/src/TortoiseProc/RebaseDlg.cpp @@ -488,6 +488,22 @@ int CRebaseDlg::StartRebase() this->AddLogString(_T("Start Rebase\r\n")); return 0; } +int CRebaseDlg::VerifyNoConflict() +{ + CTGitPathList list; + if(g_Git.ListConflictFile(list)) + { + AddLogString(_T("Get conflict files fail")); + return -1; + } + if( list.GetCount() != 0 ) + { + CMessageBox::Show(NULL,_T("There are conflict file, you should mark it resolve"),_T("TortoiseGit"),MB_OK); + return -1; + } + return 0; + +} void CRebaseDlg::OnBnClickedContinue() { if( m_RebaseStage == CHOOSE_BRANCH|| m_RebaseStage == CHOOSE_COMMIT_PICK_MODE ) @@ -517,23 +533,65 @@ void CRebaseDlg::OnBnClickedContinue() if( m_RebaseStage == REBASE_CONFLICT ) { - CTGitPathList list; - if(g_Git.ListConflictFile(list)) + if(VerifyNoConflict()) + return; + + GitRev *curRev=(GitRev*)m_CommitList.m_arShownList[m_CurrentRebaseIndex]; + + CString out =_T(""); + CString cmd; + cmd.Format(_T("git.exe commit -C %s"), curRev->m_CommitHash); + + if(g_Git.Run(cmd,&out,CP_UTF8)) { - AddLogString(_T("Get conflict files fail")); - return ; + if(!g_Git.CheckCleanWorkTree()) + { + CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK|MB_ICONERROR); + return; + } } - if( list.GetCount() != 0 ) + + AddLogString(out); + this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG); + if( curRev->m_Action & CTGitPath::LOGACTIONS_REBASE_EDIT) { - CMessageBox::Show(NULL,_T("There are conflict file, you should mark it resolve"),_T("TortoiseGit"),MB_OK); + m_RebaseStage=REBASE_EDIT; + this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_MESSAGE); + this->UpdateCurrentStatus(); return; } + else + { + m_RebaseStage=REBASE_CONTINUE; + curRev->m_Action|=CTGitPath::LOGACTIONS_REBASE_DONE; + this->UpdateCurrentStatus(); + } + + } + if( m_RebaseStage == REBASE_EDIT ) + { + CString str; GitRev *curRev=(GitRev*)m_CommitList.m_arShownList[m_CurrentRebaseIndex]; + + str=this->m_LogMessageCtrl.GetText(); + if(str.Trim().IsEmpty()) + { + CMessageBox::Show(NULL,_T("Commit Message Is Empty"),_T("TortoiseGit"),MB_OK|MB_ICONERROR); + return; + } + + CString tempfile=::GetTempFile(); + CFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate ); + CStringA log=CUnicodeUtils::GetUTF8( str); + file.Write(log,log.GetLength()); + //file.WriteString(m_sLogMessage); + file.Close(); + + CString out,cmd; + + cmd.Format(_T("git.exe commit --amend -F \"%s\""), tempfile); - CString out =_T(""); - CString cmd; - cmd.Format(_T("git.exe commit -C \"%s\""), curRev->m_CommitHash); if(g_Git.Run(cmd,&out,CP_UTF8)) { if(!g_Git.CheckCleanWorkTree()) @@ -542,6 +600,8 @@ void CRebaseDlg::OnBnClickedContinue() return; } } + + CFile::Remove(tempfile); AddLogString(out); this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG); m_RebaseStage=REBASE_CONTINUE; @@ -549,6 +609,7 @@ void CRebaseDlg::OnBnClickedContinue() this->UpdateCurrentStatus(); } + InterlockedExchange(&m_bThreadRunning, TRUE); SetControlEnable(); @@ -601,6 +662,9 @@ void CRebaseDlg::SetContinueButtonText() case REBASE_CONFLICT: Text = _T("Commit"); break; + case REBASE_EDIT: + Text = _T("Amend"); + break; case REBASE_ABORT: case REBASE_FINISH: @@ -630,6 +694,7 @@ void CRebaseDlg::SetControlEnable() case REBASE_ABORT: case REBASE_FINISH: case REBASE_CONFLICT: + case REBASE_EDIT: this->GetDlgItem(IDC_PICK_ALL)->EnableWindow(FALSE); this->GetDlgItem(IDC_EDIT_ALL)->EnableWindow(FALSE); this->GetDlgItem(IDC_SQUASH_ALL)->EnableWindow(FALSE); @@ -673,7 +738,6 @@ void CRebaseDlg::UpdateProgress() } GitRev *prevRev=NULL, *curRev=NULL; - int prevIndex; if( m_CurrentRebaseIndex >= 0 && m_CurrentRebaseIndex< m_CommitList.m_arShownList.GetSize()) { @@ -747,8 +811,9 @@ int CRebaseDlg::DoRebase() int mode=pRev->m_Action & CTGitPath::LOGACTIONS_REBASE_MODE_MASK; switch(mode) { - case CTGitPath::LOGACTIONS_REBASE_PICK: - AddLogString(CString(_T("Pick "))+pRev->m_CommitHash); + case CTGitPath::LOGACTIONS_REBASE_EDIT: + case CTGitPath::LOGACTIONS_REBASE_PICK: + AddLogString(CTGitPath::GetActionName(mode)+pRev->m_CommitHash); AddLogString(pRev->m_Subject); cmd.Format(_T("git.exe cherry-pick %s"),pRev->m_CommitHash); if(g_Git.Run(cmd,&out,CP_UTF8)) @@ -762,22 +827,30 @@ int CRebaseDlg::DoRebase() } if(list.GetCount() == 0 ) { - pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE; + if(mode == CTGitPath::LOGACTIONS_REBASE_PICK) + pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE; + else + return -1; // Edit return -1 to stop rebase. break; } this->m_RebaseStage = REBASE_CONFLICT; return -1; + }else { AddLogString(out); - pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE; + if(mode == CTGitPath::LOGACTIONS_REBASE_PICK) + pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE; + else + { + this->m_RebaseStage = REBASE_EDIT; + return -1; // Edit return -1 to stop rebase. + } } break; case CTGitPath::LOGACTIONS_REBASE_SQUASH: break; - case CTGitPath::LOGACTIONS_REBASE_EDIT: - break; case CTGitPath::LOGACTIONS_REBASE_SKIP: pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE; return 0; @@ -858,11 +931,22 @@ void CRebaseDlg::ListConflictFile() LRESULT CRebaseDlg::OnRebaseUpdateUI(WPARAM,LPARAM) { UpdateCurrentStatus(); + if(m_CurrentRebaseIndex <0) + return 0; + if(m_CurrentRebaseIndex >= m_CommitList.GetItemCount() ) + return 0; + GitRev *curRev=(GitRev*)m_CommitList.m_arShownList[m_CurrentRebaseIndex]; + switch(m_RebaseStage) { case REBASE_CONFLICT: ListConflictFile(); this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_CONFLICT); + this->m_LogMessageCtrl.SetText(curRev->m_Subject+_T("\n")+curRev->m_Body); + break; + case REBASE_EDIT: + this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_MESSAGE); + this->m_LogMessageCtrl.SetText(curRev->m_Subject+_T("\n")+curRev->m_Body); break; default: this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG); @@ -877,7 +961,10 @@ void CRebaseDlg::OnBnClickedAbort() { this->OnCancel(); } - cmd.Format(_T("git reset --hard %s"),this->m_OrigUpstreamHash); + if(CMessageBox::Show(NULL,_T("Are you sure abort rebase"),_T("TortoiseGit"),MB_YESNO) != IDYES) + return; + + cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash.Left(40)); if(g_Git.Run(cmd,&out,CP_UTF8)) { AddLogString(out); diff --git a/src/TortoiseProc/RebaseDlg.h b/src/TortoiseProc/RebaseDlg.h index af18158..8a3a34c 100644 --- a/src/TortoiseProc/RebaseDlg.h +++ b/src/TortoiseProc/RebaseDlg.h @@ -37,6 +37,7 @@ public: REBASE_ABORT, REBASE_FINISH, REBASE_CONFLICT, + REBASE_EDIT, }; protected: @@ -75,6 +76,9 @@ protected: CString m_OrigBranchHash; CString m_OrigUpstreamHash; + int VerifyNoConflict(); + CString GetRebaseModeName(int rebasemode); + public: afx_msg void OnBnClickedPickAll(); -- 2.11.0