OSDN Git Service

RebaseDlg: Edit Basic working.
authorFrank Li <lznuaa@gmail.com>
Wed, 18 Feb 2009 15:05:27 +0000 (23:05 +0800)
committerFrank Li <lznuaa@gmail.com>
Wed, 18 Feb 2009 15:05:27 +0000 (23:05 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Git/TGitPath.cpp
src/Git/TGitPath.h
src/TortoiseProc/RebaseDlg.cpp
src/TortoiseProc/RebaseDlg.h

index f8b5435..a3ddc54 100644 (file)
@@ -1865,32 +1865,35 @@ CTGitPath * CTGitPathList::LookForGitPath(CString path)
        }\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
index 632d8a1..cbb9256 100644 (file)
@@ -44,6 +44,7 @@ public:
        bool    m_Checked;\r
        int     ParserAction(BYTE action);\r
        CString GetActionName();\r
+       static CString GetActionName(int action);\r
        /**\r
         * Set the path as an UTF8 string with forward slashes\r
         */\r
index 105d412..e256980 100644 (file)
@@ -488,6 +488,22 @@ int CRebaseDlg::StartRebase()
        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
@@ -517,23 +533,65 @@ void CRebaseDlg::OnBnClickedContinue()
 \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
@@ -542,6 +600,8 @@ void CRebaseDlg::OnBnClickedContinue()
                                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
@@ -549,6 +609,7 @@ void CRebaseDlg::OnBnClickedContinue()
                this->UpdateCurrentStatus();\r
        }\r
 \r
+\r
        InterlockedExchange(&m_bThreadRunning, TRUE);\r
        SetControlEnable();\r
        \r
@@ -601,6 +662,9 @@ void CRebaseDlg::SetContinueButtonText()
        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
@@ -630,6 +694,7 @@ void CRebaseDlg::SetControlEnable()
        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
@@ -673,7 +738,6 @@ void CRebaseDlg::UpdateProgress()
        }\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
@@ -747,8 +811,9 @@ int CRebaseDlg::DoRebase()
        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
@@ -762,22 +827,30 @@ int CRebaseDlg::DoRebase()
                        }\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
@@ -858,11 +931,22 @@ void CRebaseDlg::ListConflictFile()
 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
@@ -877,7 +961,10 @@ void CRebaseDlg::OnBnClickedAbort()
        {\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
index af18158..8a3a34c 100644 (file)
@@ -37,6 +37,7 @@ public:
                REBASE_ABORT,\r
                REBASE_FINISH,\r
                REBASE_CONFLICT,\r
+               REBASE_EDIT,\r
        };\r
 \r
 protected:\r
@@ -75,6 +76,9 @@ protected:
        CString m_OrigBranchHash;\r
        CString m_OrigUpstreamHash;\r
 \r
+       int VerifyNoConflict();\r
+       CString GetRebaseModeName(int rebasemode);\r
+\r
 public:\r
    \r
     afx_msg void OnBnClickedPickAll();\r