OSDN Git Service

SyncDlg Show Conflict when pull
authorFrank Li <lznuaa@gmail.com>
Sat, 25 Jul 2009 06:01:01 +0000 (14:01 +0800)
committerFrank Li <lznuaa@gmail.com>
Sat, 25 Jul 2009 06:01:01 +0000 (14:01 +0800)
Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/SyncDlg.cpp
src/TortoiseProc/SyncDlg.h
src/TortoiseProc/resource.h

index 03ee4ad..9460c83 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index a1ee832..d1561d5 100644 (file)
@@ -26,6 +26,7 @@
 #include "progressdlg.h"\r
 #include "MessageBox.h"\r
 #include "ImportPatchDlg.h"\r
+#include "PathUtils.h"\r
 // CSyncDlg dialog\r
 \r
 IMPLEMENT_DYNAMIC(CSyncDlg, CResizableStandAloneDialog)\r
@@ -70,6 +71,7 @@ BEGIN_MESSAGE_MAP(CSyncDlg, CResizableStandAloneDialog)
        ON_NOTIFY(CBEN_ENDEDIT, IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbenEndeditComboboxexUrl)\r
        ON_CBN_EDITCHANGE(IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbnEditchangeComboboxexUrl)\r
        ON_MESSAGE(MSG_PROGRESSDLG_UPDATE_UI, OnProgressUpdateUI)\r
+       ON_BN_CLICKED(IDC_BUTTON_COMMIT, &CSyncDlg::OnBnClickedButtonCommit)\r
 END_MESSAGE_MAP()\r
 \r
 \r
@@ -86,9 +88,145 @@ void CSyncDlg::EnableControlButton(bool bEnabled)
 void CSyncDlg::OnBnClickedButtonPull()\r
 {\r
        // TODO: Add your control notification handler code here\r
-       this->m_regPullButton =this->m_ctrlPull.GetCurrentEntry();\r
+       int CurrentEntry;\r
+       CurrentEntry = this->m_ctrlPull.GetCurrentEntry();                   \r
+       this->m_regPullButton = CurrentEntry;\r
+\r
+\r
+       this->m_bAbort=false;\r
+       this->m_GitCmdList.clear();\r
+\r
+       this->UpdateData();\r
+       UpateCombox();\r
+\r
+       m_oldHash = g_Git.GetHash(CString(_T("HEAD")));\r
+\r
+       if( CurrentEntry == 0)\r
+       {\r
+               if( g_Git.GetHash(this->m_strLocalBranch) != m_oldHash)\r
+               {\r
+                       CMessageBox::Show(NULL,_T("Pull require local branch must be current branch"),_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+                       return;                                                 \r
+               }\r
+       }\r
+\r
+       if(this->m_strURL.IsEmpty())\r
+       {\r
+               CMessageBox::Show(NULL,_T("URL can't Empty"),_T("TortoiseGit"),MB_OK|MB_ICONERROR);\r
+               return;\r
+       }\r
+\r
+       if(this->m_bAutoLoadPuttyKey)\r
+       {\r
+               CAppUtils::LaunchPAgent(NULL,&this->m_strURL);\r
+       }\r
+\r
+       this->SwitchToRun();\r
+\r
+       CString force;\r
+       if(this->m_bForce)\r
+               force = _T(" --force ");\r
+\r
+       CString cmd;\r
+\r
+       ShowTab(IDC_CMD_LOG);\r
+\r
+       this->m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,false);\r
+       this->m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,false);\r
+       this->m_ctrlTabCtrl.ShowTab(IDC_IN_CONFLICT-1,false);\r
+\r
+       this->GetDlgItem(IDC_BUTTON_COMMIT)->ShowWindow(SW_HIDE);\r
+\r
+       ///Pull \r
+       if(CurrentEntry == 0) //Pull\r
+       {\r
+               cmd.Format(_T("git.exe pull %s \"%s\" %s"),\r
+                               force,\r
+                               m_strURL,\r
+                               this->m_strRemoteBranch);\r
+\r
+               m_CurrentCmd = GIT_COMMAND_PULL;\r
+               m_GitCmdList.push_back(cmd);\r
+\r
+               m_pThread = AfxBeginThread(ProgressThreadEntry, this, THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);\r
+               if (m_pThread==NULL)\r
+               {\r
+               //              ReportError(CString(MAKEINTRESOURCE(IDS_ERR_THREADSTARTFAILED)));\r
+               }\r
+               else\r
+               {\r
+                       m_pThread->m_bAutoDelete = TRUE;\r
+                       m_pThread->ResumeThread();\r
+               }\r
+\r
+       }\r
+       \r
+}\r
+\r
+void CSyncDlg::PullComplete()\r
+{\r
+       EnableControlButton(true);\r
+       SwitchToInput();\r
+       this->FetchOutList(true);\r
+\r
+       CString newhash;\r
+       newhash = g_Git.GetHash(CString(_T("HEAD")));\r
+\r
+       \r
+\r
+       if( this ->m_GitCmdStatus )\r
+       {\r
+               CTGitPathList list;\r
+               if(g_Git.ListConflictFile(list))\r
+               {\r
+                       this->m_ctrlCmdOut.SetSel(-1,-1);\r
+                       this->m_ctrlCmdOut.ReplaceSel(_T("Get conflict files fail\n"));\r
+\r
+                       this->ShowTab(IDC_CMD_LOG);\r
+                       return;\r
+               }\r
+\r
+               if(list.GetCount()>0)\r
+               {\r
+                       this->m_ConflictFileList.Clear();       \r
+                       CTGitPathList list;\r
+                       CTGitPath path;\r
+                       list.AddPath(path);\r
+\r
+                       this->m_ConflictFileList.GetStatus(&list,true);\r
+                       this->m_ConflictFileList.Show(CTGitPath::LOGACTIONS_UNMERGED,\r
+                                                                         CTGitPath::LOGACTIONS_UNMERGED);\r
+                       \r
+                       this->ShowTab(IDC_IN_CONFLICT);\r
+\r
+                       this->GetDlgItem(IDC_BUTTON_COMMIT)->ShowWindow(SW_NORMAL);\r
+               }\r
+               else\r
+                       this->ShowTab(IDC_CMD_LOG);\r
+\r
+       }else\r
+       {\r
+               if(newhash == this->m_oldHash)\r
+               {\r
+                       this->m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,false);\r
+                       this->m_InLogList.ShowText(_T("No commits get after pull"));\r
+                       this->m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,true);\r
+               }\r
+               else\r
+               {\r
+                       this->m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,true);\r
+                       this->m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,true);\r
+                       \r
+                       this->AddDiffFileList(&m_InChangeFileList,&m_arInChangeList,newhash,m_oldHash);\r
+               \r
+                       m_InLogList.FillGitLog(NULL,CGit::      LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,\r
+                               &this->m_oldHash,&newhash);\r
+               }\r
+               this->ShowTab(IDC_IN_LOGLIST);\r
+       }\r
 }\r
 \r
+\r
 void CSyncDlg::OnBnClickedButtonPush()\r
 {\r
        // TODO: Add your control notification handler code here\r
@@ -105,12 +243,8 @@ void CSyncDlg::OnBnClickedButtonPush()
        CString tags;\r
        CString force;\r
        CString all;\r
-       this->m_strLocalBranch = this->m_ctrlLocalBranch.GetString();\r
-       this->m_ctrlRemoteBranch.GetWindowText(this->m_strRemoteBranch);\r
-       this->m_ctrlURL.GetWindowText(this->m_strURL);\r
-       m_strRemoteBranch=m_strRemoteBranch.Trim();\r
-       \r
-       this->GetDlgItem(IDC_CHECK_PUTTY_KEY)->EnableWindow(this->m_bAutoLoadPuttyKey);\r
+\r
+       UpateCombox();\r
 \r
        switch (m_ctrlPush.GetCurrentEntry())\r
        {\r
@@ -206,6 +340,9 @@ void CSyncDlg::OnBnClickedButtonApply()
                        this->AddDiffFileList(&m_InChangeFileList,&m_arInChangeList,newhash,oldhash);\r
                        m_InLogList.FillGitLog(NULL,CGit::      LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,\r
                                &oldhash,&newhash);\r
+\r
+                       this->FetchOutList(true);\r
+\r
                }\r
 \r
                this->m_ctrlTabCtrl.ShowTab(IDC_CMD_LOG-1,true);\r
@@ -338,7 +475,23 @@ BOOL CSyncDlg::OnInitDialog()
                                                        CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_GNUDIFF2)),false);\r
 \r
 \r
-       //----------  Create Commit List Ctrl---------------\r
+       //---------- Create Conflict List Ctrl -----------------\r
+       dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
+       \r
+       if( !m_ConflictFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_IN_CONFLICT))\r
+       {\r
+               TRACE0("Failed to create output change files window\n");\r
+               return FALSE;      // fail to create\r
+       }\r
+       m_ctrlTabCtrl.InsertTab(&m_ConflictFileList,_T("Conflict"),-1);\r
+\r
+       m_ConflictFileList.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("OutSyncDlg"),\r
+                                   (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_COMPARETWO)|\r
+                                                       CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_GNUDIFF2)|\r
+                                                       SVNSLC_POPCONFLICT|SVNSLC_POPRESOLVE),false);\r
+\r
+\r
+       //----------  Create Commit Out List Ctrl---------------\r
                        \r
        dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;;\r
 \r
@@ -385,9 +538,12 @@ BOOL CSyncDlg::OnInitDialog()
        AddAnchor(IDHELP,BOTTOM_RIGHT);\r
        AddAnchor(IDC_STATIC_STATUS,BOTTOM_LEFT);\r
        AddAnchor(IDC_ANIMATE_SYNC,TOP_LEFT);\r
+       AddAnchor(IDC_BUTTON_COMMIT,BOTTOM_LEFT);\r
        \r
        BRANCH_COMBOX_ADD_ANCHOR();\r
 \r
+       this->GetDlgItem(IDC_BUTTON_COMMIT)->ShowWindow(SW_HIDE);\r
+\r
        CString WorkingDir=g_Git.m_CurrentDir;\r
        WorkingDir.Replace(_T(':'),_T('_'));\r
        m_RegKeyRemoteBranch = CString(_T("Software\\TortoiseGit\\History\\SyncBranch\\"))+WorkingDir;\r
@@ -431,7 +587,8 @@ BOOL CSyncDlg::OnInitDialog()
        m_ctrlTabCtrl.ShowTab(IDC_CMD_LOG-1,false);\r
        m_ctrlTabCtrl.ShowTab(IDC_IN_LOGLIST-1,false);\r
        m_ctrlTabCtrl.ShowTab(IDC_IN_CHANGELIST-1,false);\r
-       \r
+       m_ctrlTabCtrl.ShowTab(IDC_IN_CONFLICT-1,false);\r
+               \r
        return TRUE;  // return TRUE unless you set the focus to a control\r
        // EXCEPTION: OCX Property Pages should return FALSE\r
 }\r
@@ -566,11 +723,16 @@ LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)
                //this->DialogEnableWindow(IDOK,TRUE);\r
 \r
                //if(wParam == MSG_PROGRESSDLG_END)\r
+               if(this->m_CurrentCmd == GIT_COMMAND_PUSH )\r
                {\r
                        EnableControlButton(true);\r
                        SwitchToInput();\r
                        this->FetchOutList(true);\r
                }\r
+               if(this->m_CurrentCmd == GIT_COMMAND_PULL )\r
+               {\r
+                       PullComplete();\r
+               }\r
        }\r
 \r
        if(lParam != 0)\r
@@ -579,6 +741,7 @@ LRESULT CSyncDlg::OnProgressUpdateUI(WPARAM wParam,LPARAM lParam)
        return 0;\r
 }\r
 \r
+\r
 void CSyncDlg::ParserCmdOutput(TCHAR ch)\r
 {\r
        //TRACE(_T("%c"),ch);\r
@@ -622,4 +785,14 @@ void CSyncDlg::ParserCmdOutput(TCHAR ch)
        }\r
        m_LogText+=ch;\r
 \r
-}
\ No newline at end of file
+}\r
+void CSyncDlg::OnBnClickedButtonCommit()\r
+{\r
+       // TODO: Add your control notification handler code here\r
+    CString proc=CPathUtils::GetAppDirectory();\r
+    proc += _T("TortoiseProc.exe /command:commit");\r
+    proc += _T(" /path:\"");\r
+    proc += g_Git.m_CurrentDir;\r
+    \r
+       CAppUtils::LaunchApplication(proc,IDS_ERROR_CANNON_FIND_TORTOISEPROC,false);\r
+}\r
index 7f54c3b..32957a9 100644 (file)
@@ -34,8 +34,9 @@
 #define IDC_CMD_LOG                    0x1\r
 #define IDC_IN_LOGLIST         0x2\r
 #define IDC_IN_CHANGELIST      0x3\r
-#define IDC_OUT_LOGLIST                0x4\r
-#define IDC_OUT_CHANGELIST     0x5\r
+#define IDC_IN_CONFLICT                0x4\r
+#define IDC_OUT_LOGLIST                0x5\r
+#define IDC_OUT_CHANGELIST     0x6\r
 \r
 class CSyncDlg : public CResizableStandAloneDialog,public CBranchCombox\r
 {\r
@@ -71,6 +72,7 @@ protected:
        CGitStatusListCtrl m_OutChangeFileList;\r
        CGitStatusListCtrl m_InChangeFileList;\r
        CGitStatusListCtrl m_ConflictFileList;\r
+       \r
        CRichEditCtrl      m_ctrlCmdOut;\r
 \r
        CTGitPathList   m_arOutChangeList;\r
@@ -112,6 +114,8 @@ protected:
        CString m_OutLocalBranch;\r
        CString m_OutRemoteBranch;\r
        \r
+       CString m_oldHash;\r
+\r
        void ShowProgressCtrl(bool bShow=true);\r
        void ShowInputCtrl(bool bShow=true);\r
        void SwitchToRun(){ShowProgressCtrl(true);ShowInputCtrl(false);EnableControlButton(false);}\r
@@ -119,6 +123,14 @@ protected:
        \r
        LRESULT OnProgressUpdateUI(WPARAM wParam,LPARAM lParam);\r
 \r
+       void UpateCombox()\r
+       {\r
+               this->m_strLocalBranch = this->m_ctrlLocalBranch.GetString();\r
+               this->m_ctrlRemoteBranch.GetWindowText(this->m_strRemoteBranch);\r
+               this->m_ctrlURL.GetWindowText(this->m_strURL);\r
+               m_strRemoteBranch=m_strRemoteBranch.Trim();\r
+       }\r
+\r
        void AddDiffFileList(CGitStatusListCtrl *pCtrlList, CTGitPathList *pGitList,\r
                                                        CString &rev1,CString &rev2)\r
        {\r
@@ -130,6 +142,8 @@ protected:
                return;\r
        }\r
 \r
+       void PullComplete();\r
+\r
        DECLARE_MESSAGE_MAP()\r
 public:\r
        BOOL m_bAutoLoadPuttyKey;\r
@@ -157,4 +171,5 @@ public:
        afx_msg void OnCbnEditchangeComboboxexUrl();\r
 \r
        void EnableControlButton(bool bEnabled=true);\r
+       afx_msg void OnBnClickedButtonCommit();\r
 };\r
index 50bf2eb..3a9d50c 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ