OSDN Git Service

Enable Abort Button at git progress dialog by terminate process.
authorFrank Li <lznuaa@gmail.com>
Sun, 11 Oct 2009 06:10:21 +0000 (14:10 +0800)
committerFrank Li <lznuaa@gmail.com>
Sun, 11 Oct 2009 06:10:21 +0000 (14:10 +0800)
This way is not safety.

Signed-off-by: Frank Li <lznuaa@gmail.com>
src/Git/Git.cpp
src/Git/Git.h
src/TortoiseProc/Commands/FetchCommand.cpp
src/TortoiseProc/Commands/PullCommand.cpp
src/TortoiseProc/ProgressDlg.cpp

index 1f5b3c2..a105f19 100644 (file)
@@ -174,7 +174,9 @@ int CGit::RunAsync(CString cmd,PROCESS_INFORMATION *piOut,HANDLE *hReadOut,CStri
        DWORD dwFlags = pEnv ? CREATE_UNICODE_ENVIRONMENT : 0;\r
        \r
        //DETACHED_PROCESS make ssh recognize that it has no console to launch askpass to input password. \r
-       dwFlags |= DETACHED_PROCESS; \r
+       dwFlags |= DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP; \r
+\r
+       memset(&this->m_CurrentGitPi,0,sizeof(PROCESS_INFORMATION));\r
 \r
        if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,dwFlags,pEnv,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))\r
        {\r
@@ -186,6 +188,8 @@ int CGit::RunAsync(CString cmd,PROCESS_INFORMATION *piOut,HANDLE *hReadOut,CStri
                return GIT_ERROR_CREATE_PROCESS;\r
        }\r
        \r
+       m_CurrentGitPi = pi;\r
+       \r
        CloseHandle(hWrite);\r
        if(piOut)\r
                *piOut=pi;\r
index 6b39095..ba62ff1 100644 (file)
@@ -35,6 +35,9 @@ public:
        static CString ms_LastMsysGitDir;       // the last msysgitdir added to the path, blank if none\r
        static int m_LogEncode;\r
 //     static CString m_MsysGitPath;\r
+       \r
+       PROCESS_INFORMATION m_CurrentGitPi;\r
+\r
        CGit(void);\r
        ~CGit(void);\r
        \r
index e5953f9..6bf4946 100644 (file)
@@ -43,7 +43,7 @@ bool FetchCommand::Execute()
                CString url;\r
                url=dlg.m_RemoteURL;\r
                CString cmd;\r
-               cmd.Format(_T("git.exe fetch \"%s\" %s"),url, dlg.m_RemoteBranchName);\r
+               cmd.Format(_T("git.exe fetch -v \"%s\" %s"),url, dlg.m_RemoteBranchName);\r
                CProgressDlg progress;\r
 \r
                if(!dlg.m_bRebase)\r
index 5419e0d..a915c4c 100644 (file)
@@ -47,7 +47,7 @@ bool PullCommand::Execute()
                CString cmdRebase;\r
                if(dlg.m_bRebase)\r
                        cmdRebase = "--rebase ";\r
-               cmd.Format(_T("git.exe pull %s\"%s\" %s"),cmdRebase, url, dlg.m_RemoteBranchName);\r
+               cmd.Format(_T("git.exe pull -v %s\"%s\" %s"),cmdRebase, url, dlg.m_RemoteBranchName);\r
                CProgressDlg progress;\r
                progress.m_GitCmd = cmd;\r
                progress.m_bAutoCloseOnSuccess = true;\r
index 3d98d3c..b1fc50f 100644 (file)
@@ -326,13 +326,34 @@ void CProgressDlg::OnBnClickedButton1()
 }\r
 void CProgressDlg::OnCancel()\r
 {\r
+       m_bAbort = true;\r
        if(m_bDone)\r
        {\r
                CResizableStandAloneDialog::OnCancel();\r
                return;\r
        }\r
+\r
+       if( g_Git.m_CurrentGitPi.hProcess )\r
+       {\r
+               if(::GenerateConsoleCtrlEvent(CTRL_C_EVENT,0))\r
+               {\r
+                       ::WaitForSingleObject(g_Git.m_CurrentGitPi.hProcess ,10000);\r
+               }else\r
+               {\r
+                       int error=::GetLastError();\r
+               }\r
+\r
+               HANDLE  hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,g_Git.m_CurrentGitPi.dwProcessId);\r
+               if( hProcessHandle )\r
+                       if(!::TerminateProcess(hProcessHandle,-1) )\r
+                       {\r
+                               int error =::GetLastError();\r
+                       }\r
+       }\r
        \r
-       m_bAbort = true;\r
+       ::WaitForSingleObject(g_Git.m_CurrentGitPi.hProcess ,10000);\r
+       CResizableStandAloneDialog::OnCancel();\r
+\r
 }\r
 \r
 void CProgressDlg::InsertCRLF()\r