OSDN Git Service

RebaseDlg: List Conflict file when cherry pick fail
authorFrank Li <lznuaa@gmail.com>
Mon, 16 Feb 2009 15:50:56 +0000 (23:50 +0800)
committerFrank Li <lznuaa@gmail.com>
Mon, 16 Feb 2009 15:50:56 +0000 (23:50 +0800)
src/Git/Git.cpp
src/Git/Git.h
src/Git/GitStatusListCtrl.cpp
src/TortoiseProc/RebaseDlg.cpp
src/TortoiseProc/RebaseDlg.h

index 8b58778..6208576 100644 (file)
@@ -956,4 +956,24 @@ BOOL CGit::CheckCleanWorkTree()
                return FALSE;\r
 \r
        return TRUE;\r
+}\r
+\r
+int CGit::ListConflictFile(CTGitPathList &list,CTGitPath *path)\r
+{\r
+       BYTE_VECTOR vector;\r
+\r
+       CString cmd;\r
+       if(path)\r
+               cmd.Format(_T("git.exe ls-files -u -t -z -- \"%s\""),path->GetGitPathString());\r
+       else\r
+               cmd=_T("git.exe ls-files -u -t -z");\r
+\r
+       if(g_Git.Run(cmd,&vector))\r
+       {\r
+               return -1;\r
+       }\r
+\r
+       list.ParserFromLsFile(vector);\r
+\r
+       return 0;\r
 }
\ No newline at end of file
index 99c41a1..856c71c 100644 (file)
@@ -100,6 +100,7 @@ public:
 \r
        BOOL IsInitRepos();\r
        static BOOL IsVista();\r
+       int ListConflictFile(CTGitPathList &list,CTGitPath *path=NULL);\r
        \r
 };\r
 extern void GetTempPath(CString &path);\r
index 077eedd..3606b2d 100644 (file)
@@ -1083,6 +1083,7 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
                        m_arStatusArray.push_back((CTGitPath*)&m_IgnoreFileList[i]);\r
                }\r
        }\r
+       int index =0;\r
        for(int i=0;i<this->m_arStatusArray.size();i++)\r
        {\r
                //set default checkbox status\r
@@ -1090,7 +1091,10 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
                        ((CTGitPath*)m_arStatusArray[i])->m_Checked=true;\r
 \r
                if(((CTGitPath*)m_arStatusArray[i])->m_Action & dwShow)\r
-                       AddEntry((CTGitPath*)m_arStatusArray[i],langID,i);\r
+               {\r
+                       AddEntry((CTGitPath*)m_arStatusArray[i],langID,index);\r
+                       index++;\r
+               }\r
        }\r
        \r
        int maxcol = ((CHeaderCtrl*)(GetDlgItem(0)))->GetItemCount()-1;\r
@@ -5346,7 +5350,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
        TCHAR groupname[1024];\r
        int groupindex = 0;\r
 \r
-       if(bHasGroups);\r
+       if(bHasGroups)\r
        {\r
                LVGROUP grp = {0};\r
                grp.cbSize = sizeof(LVGROUP);\r
index abf30b3..d399231 100644 (file)
@@ -51,6 +51,7 @@ BEGIN_MESSAGE_MAP(CRebaseDlg, CResizableStandAloneDialog)
        ON_WM_SIZE()\r
        ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_BRANCH,   &CRebaseDlg::OnCbnSelchangeBranch)\r
        ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_UPSTREAM, &CRebaseDlg::OnCbnSelchangeUpstream)\r
+       ON_MESSAGE(MSG_REBASE_UPDATE_UI, OnRebaseUpdateUI)\r
 END_MESSAGE_MAP()\r
 \r
 void CRebaseDlg::AddRebaseAnchor()\r
@@ -99,7 +100,7 @@ BOOL CRebaseDlg::OnInitDialog()
        m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);\r
        // Create output panes:\r
        //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;\r
-       DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
+       DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
 \r
        if (! this->m_FileListCtrl.Create(dwStyle,rectDummy,&this->m_ctrlTabCtrl,0) )\r
        {\r
@@ -126,7 +127,7 @@ BOOL CRebaseDlg::OnInitDialog()
        \r
        m_tooltips.Create(this);\r
 \r
-       m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS , _T("RebaseDlg"));\r
+       m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |IDS_STATUSLIST_COLADD|IDS_STATUSLIST_COLDEL , _T("RebaseDlg"),(SVNSLC_POPALL ^ SVNSLC_POPCOMMIT),false);\r
 \r
        m_ctrlTabCtrl.AddTab(&m_FileListCtrl,_T("Conflict File"));\r
        m_ctrlTabCtrl.AddTab(&m_LogMessageCtrl,_T("Commit Message"),1);\r
@@ -529,6 +530,11 @@ void CRebaseDlg::SetContinueButtonText()
        case REBASE_CONTINUE:\r
                Text = _T("Continue");\r
                break;\r
+\r
+       case REBASE_CONFLICT:\r
+               Text = _T("Commit");\r
+               break;\r
+\r
        case REBASE_ABORT:\r
        case REBASE_FINISH:\r
                Text = _T("Finish");\r
@@ -556,6 +562,7 @@ void CRebaseDlg::SetControlEnable()
        case REBASE_CONTINUE:\r
        case REBASE_ABORT:\r
        case REBASE_FINISH:\r
+       case REBASE_CONFLICT:\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
@@ -667,6 +674,7 @@ void CRebaseDlg::AddLogString(CString str)
 \r
 int CRebaseDlg::DoRebase()\r
 {      \r
+       CString cmd,out;\r
        if(m_CurrentRebaseIndex <0)\r
                return 0;\r
        if(m_CurrentRebaseIndex >= m_CommitList.GetItemCount() )\r
@@ -680,7 +688,29 @@ int CRebaseDlg::DoRebase()
        {\r
        case CTGitPath::LOGACTIONS_REBASE_PICK:\r
                AddLogString(CString(_T("Pick "))+pRev->m_CommitHash);\r
-               pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
+               cmd.Format(_T("git.exe cherry-pick %s"),pRev->m_CommitHash);\r
+               if(g_Git.Run(cmd,&out,CP_UTF8))\r
+               {\r
+                       AddLogString(out);\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
+                               pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
+                               break;\r
+                       }\r
+\r
+                       this->m_RebaseStage = REBASE_CONFLICT;\r
+                       return -1;      \r
+               }else\r
+               {\r
+                       AddLogString(out);\r
+                       pRev->m_Action|= CTGitPath::LOGACTIONS_REBASE_DONE;\r
+               }\r
                break;\r
        case CTGitPath::LOGACTIONS_REBASE_SQUASH:\r
                break;\r
@@ -738,12 +768,41 @@ int CRebaseDlg::RebaseThread()
                                break;\r
                        }\r
                }\r
-               this->UpdateCurrentStatus();\r
+               this->PostMessage(MSG_REBASE_UPDATE_UI);\r
+               //this->UpdateCurrentStatus();\r
        }\r
 \r
        InterlockedExchange(&m_bThreadRunning, FALSE);\r
-       this->UpdateCurrentStatus();\r
-       this->SetControlEnable();\r
-       this->SetContinueButtonText();\r
+       this->PostMessage(MSG_REBASE_UPDATE_UI);\r
        return ret;\r
+}\r
+\r
+void CRebaseDlg::ListConflictFile()\r
+{\r
+       this->m_FileListCtrl.DeleteAllItems();  \r
+       CTGitPathList list;\r
+       CTGitPath path;\r
+       list.AddPath(path);\r
+\r
+       this->m_FileListCtrl.GetStatus(list);\r
+       this->m_FileListCtrl.Show(CTGitPath::LOGACTIONS_UNMERGED,CTGitPath::LOGACTIONS_UNMERGED);\r
+       if( this->m_FileListCtrl.GetItemCount() == 0 )\r
+       {\r
+               \r
+       }\r
+}\r
+\r
+LRESULT CRebaseDlg::OnRebaseUpdateUI(WPARAM,LPARAM)\r
+{\r
+       UpdateCurrentStatus();\r
+       switch(m_RebaseStage)\r
+       {\r
+       case REBASE_CONFLICT:\r
+               ListConflictFile();                     \r
+               this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_CONFLICT);\r
+               break;\r
+       default:\r
+               this->m_ctrlTabCtrl.SetActiveTab(REBASE_TAB_LOG);\r
+       }       \r
+       return 0;\r
 }
\ No newline at end of file
index e44ec83..735a743 100644 (file)
@@ -15,6 +15,8 @@
 #define REBASE_TAB_MESSAGE   1\r
 #define REBASE_TAB_LOG          2\r
 \r
+#define MSG_REBASE_UPDATE_UI   (WM_USER+151)\r
+\r
 class CRebaseDlg : public CResizableStandAloneDialog\r
 {\r
        DECLARE_DYNAMIC(CRebaseDlg)\r
@@ -34,6 +36,7 @@ public:
                REBASE_CONTINUE,\r
                REBASE_ABORT,\r
                REBASE_FINISH,\r
+               REBASE_CONFLICT,\r
        };\r
 \r
 protected:\r
@@ -41,6 +44,7 @@ protected:
        virtual BOOL OnInitDialog();\r
        DECLARE_MESSAGE_MAP()\r
        virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);\r
+       LRESULT OnRebaseUpdateUI(WPARAM wParam, LPARAM lParam);\r
        void DoSize(int delta);\r
        void AddRebaseAnchor();\r
        void RemoveAnchor();\r
@@ -61,6 +65,7 @@ protected:
        void SetControlEnable();\r
        void UpdateProgress();\r
        void UpdateCurrentStatus();\r
+       void ListConflictFile();\r
        int  DoRebase();\r
        volatile LONG           m_bThreadRunning;\r
        int  RebaseThread();\r