}\r
return NULL;\r
}\r
-\r
-CString CTGitPath::GetActionName()\r
+CString CTGitPath::GetActionName(int action)\r
{\r
- if(m_Action & CTGitPath::LOGACTIONS_ADDED)\r
+ if(action & CTGitPath::LOGACTIONS_ADDED)\r
return _T("Added");\r
- if(m_Action & CTGitPath::LOGACTIONS_DELETED)\r
+ if(action & CTGitPath::LOGACTIONS_DELETED)\r
return _T("Deleted");\r
- if(m_Action & CTGitPath::LOGACTIONS_UNMERGED)\r
+ if(action & CTGitPath::LOGACTIONS_UNMERGED)\r
return _T("Conflict");\r
- if(m_Action & CTGitPath::LOGACTIONS_MODIFIED)\r
+ if(action & CTGitPath::LOGACTIONS_MODIFIED)\r
return _T("Modified");\r
- if(m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
+ if(action & CTGitPath::LOGACTIONS_REPLACED)\r
return _T("Rename");\r
- if(m_Action & CTGitPath::LOGACTIONS_COPY)\r
+ if(action & CTGitPath::LOGACTIONS_COPY)\r
return _T("Copy");\r
- if(m_Action & CTGitPath::LOGACTIONS_REBASE_EDIT)\r
+ if(action & CTGitPath::LOGACTIONS_REBASE_EDIT)\r
return _T("Edit");\r
- if(m_Action & CTGitPath::LOGACTIONS_REBASE_SQUASH)\r
+ if(action & CTGitPath::LOGACTIONS_REBASE_SQUASH)\r
return _T("Squash");\r
- if(m_Action & CTGitPath::LOGACTIONS_REBASE_PICK)\r
+ if(action & CTGitPath::LOGACTIONS_REBASE_PICK)\r
return _T("Pick");\r
- if(m_Action & CTGitPath::LOGACTIONS_REBASE_SKIP)\r
+ if(action & CTGitPath::LOGACTIONS_REBASE_SKIP)\r
return _T("Skip");\r
\r
return _T("Unknown");\r
}\r
+CString CTGitPath::GetActionName()\r
+{\r
+ return GetActionName(m_Action);\r
+}\r
\r
int CTGitPathList::GetAction()\r
{\r
this->AddLogString(_T("Start Rebase\r\n"));\r
return 0;\r
}\r
+int CRebaseDlg::VerifyNoConflict()\r
+{\r
+ CTGitPathList list;\r
+ if(g_Git.ListConflictFile(list))\r
+ {\r
+ AddLogString(_T("Get conflict files fail"));\r
+ return -1;\r
+ }\r
+ if( list.GetCount() != 0 )\r
+ {\r
+ CMessageBox::Show(NULL,_T("There are conflict file, you should mark it resolve"),_T("TortoiseGit"),MB_OK);\r
+ return -1;\r
+ }\r
+ return 0;\r
+\r
+}\r
void CRebaseDlg::OnBnClickedContinue()\r
{\r
if( m_RebaseStage == CHOOSE_BRANCH|| m_RebaseStage == CHOOSE_COMMIT_PICK_MODE )\r
\r
if( m_RebaseStage == REBASE_CONFLICT )\r
{\r
- CTGitPathList list;\r
- if(g_Git.ListConflictFile(list))\r
+ if(VerifyNoConflict())\r
+ return;\r
+\r
+ GitRev *curRev=(GitRev*)m_CommitList.m_arShownList[m_CurrentRebaseIndex];\r
+ \r
+ CString out =_T("");\r
+ CString cmd;\r
+ cmd.Format(_T("git.exe commit -C %s"), curRev->m_CommitHash);\r
+\r
+ if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r
- AddLogString(_T("Get conflict files fail"));\r
- return ;\r
+ if(!g_Git.CheckCleanWorkTree())\r
+ {\r
+ CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return;\r
+ }\r
}\r
- if( list.GetCount() != 0 )\r
+\r
+ AddLogString(out);\r
+ this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG);\r
+ if( curRev->m_Action & CTGitPath::LOGACTIONS_REBASE_EDIT)\r
{\r
- CMessageBox::Show(NULL,_T("There are conflict file, you should mark it resolve"),_T("TortoiseGit"),MB_OK);\r
+ m_RebaseStage=REBASE_EDIT;\r
+ this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_MESSAGE);\r
+ this->UpdateCurrentStatus();\r
return;\r
}\r
+ else\r
+ {\r
+ m_RebaseStage=REBASE_CONTINUE;\r
+ curRev->m_Action|=CTGitPath::LOGACTIONS_REBASE_DONE;\r
+ this->UpdateCurrentStatus();\r
+ }\r
+ \r
+ }\r
\r
+ if( m_RebaseStage == REBASE_EDIT )\r
+ {\r
+ CString str;\r
GitRev *curRev=(GitRev*)m_CommitList.m_arShownList[m_CurrentRebaseIndex];\r
+ \r
+ str=this->m_LogMessageCtrl.GetText();\r
+ if(str.Trim().IsEmpty())\r
+ {\r
+ CMessageBox::Show(NULL,_T("Commit Message Is Empty"),_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+ return;\r
+ }\r
+\r
+ CString tempfile=::GetTempFile();\r
+ CFile file(tempfile,CFile::modeReadWrite|CFile::modeCreate );\r
+ CStringA log=CUnicodeUtils::GetUTF8( str);\r
+ file.Write(log,log.GetLength());\r
+ //file.WriteString(m_sLogMessage);\r
+ file.Close();\r
+ \r
+ CString out,cmd;\r
+ \r
+ cmd.Format(_T("git.exe commit --amend -F \"%s\""), tempfile);\r
\r
- CString out =_T("");\r
- CString cmd;\r
- cmd.Format(_T("git.exe commit -C \"%s\""), curRev->m_CommitHash);\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r
if(!g_Git.CheckCleanWorkTree())\r
return;\r
}\r
}\r
+\r
+ CFile::Remove(tempfile);\r
AddLogString(out);\r
this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG);\r
m_RebaseStage=REBASE_CONTINUE;\r
this->UpdateCurrentStatus();\r
}\r
\r
+\r
InterlockedExchange(&m_bThreadRunning, TRUE);\r
SetControlEnable();\r
\r
case REBASE_CONFLICT:\r
Text = _T("Commit");\r
break;\r
+ case REBASE_EDIT:\r
+ Text = _T("Amend");\r
+ break;\r
\r
case REBASE_ABORT:\r
case REBASE_FINISH:\r
case REBASE_ABORT:\r
case REBASE_FINISH:\r
case REBASE_CONFLICT:\r
+ case REBASE_EDIT:\r
this->GetDlgItem(IDC_PICK_ALL)->EnableWindow(FALSE);\r
this->GetDlgItem(IDC_EDIT_ALL)->EnableWindow(FALSE);\r
this->GetDlgItem(IDC_SQUASH_ALL)->EnableWindow(FALSE);\r
}\r
\r
GitRev *prevRev=NULL, *curRev=NULL;\r
- int prevIndex;\r
\r
if( m_CurrentRebaseIndex >= 0 && m_CurrentRebaseIndex< m_CommitList.m_arShownList.GetSize())\r
{\r
int mode=pRev->m_Action & CTGitPath::LOGACTIONS_REBASE_MODE_MASK;\r
switch(mode)\r
{\r
- case CTGitPath::LOGACTIONS_REBASE_PICK:\r
- AddLogString(CString(_T("Pick "))+pRev->m_CommitHash);\r
+ case CTGitPath::LOGACTIONS_REBASE_EDIT:\r
+ case CTGitPath::LOGACTIONS_REBASE_PICK: \r
+ AddLogString(CTGitPath::GetActionName(mode)+pRev->m_CommitHash);\r
AddLogString(pRev->m_Subject);\r
cmd.Format(_T("git.exe cherry-pick %s"),pRev->m_CommitHash);\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
}\r
if(list.GetCount() == 0 )\r
{\r
- pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
+ if(mode == CTGitPath::LOGACTIONS_REBASE_PICK)\r
+ pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
+ else\r
+ return -1; // Edit return -1 to stop rebase. \r
break;\r
}\r
\r
this->m_RebaseStage = REBASE_CONFLICT;\r
return -1; \r
+\r
}else\r
{\r
AddLogString(out);\r
- pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
+ if(mode == CTGitPath::LOGACTIONS_REBASE_PICK)\r
+ pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
+ else\r
+ {\r
+ this->m_RebaseStage = REBASE_EDIT;\r
+ return -1; // Edit return -1 to stop rebase. \r
+ }\r
}\r
break;\r
case CTGitPath::LOGACTIONS_REBASE_SQUASH:\r
break;\r
- case CTGitPath::LOGACTIONS_REBASE_EDIT:\r
- break;\r
case CTGitPath::LOGACTIONS_REBASE_SKIP:\r
pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
return 0;\r
LRESULT CRebaseDlg::OnRebaseUpdateUI(WPARAM,LPARAM)\r
{\r
UpdateCurrentStatus();\r
+ if(m_CurrentRebaseIndex <0)\r
+ return 0;\r
+ if(m_CurrentRebaseIndex >= m_CommitList.GetItemCount() )\r
+ return 0;\r
+ GitRev *curRev=(GitRev*)m_CommitList.m_arShownList[m_CurrentRebaseIndex];\r
+ \r
switch(m_RebaseStage)\r
{\r
case REBASE_CONFLICT:\r
ListConflictFile(); \r
this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_CONFLICT);\r
+ this->m_LogMessageCtrl.SetText(curRev->m_Subject+_T("\n")+curRev->m_Body);\r
+ break;\r
+ case REBASE_EDIT:\r
+ this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_MESSAGE);\r
+ this->m_LogMessageCtrl.SetText(curRev->m_Subject+_T("\n")+curRev->m_Body);\r
break;\r
default:\r
this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG);\r
{\r
this->OnCancel();\r
}\r
- cmd.Format(_T("git reset --hard %s"),this->m_OrigUpstreamHash);\r
+ if(CMessageBox::Show(NULL,_T("Are you sure abort rebase"),_T("TortoiseGit"),MB_YESNO) != IDYES)\r
+ return;\r
+\r
+ cmd.Format(_T("git.exe reset --hard %s"),this->m_OrigUpstreamHash.Left(40));\r
if(g_Git.Run(cmd,&out,CP_UTF8))\r
{\r
AddLogString(out);\r