OSDN Git Service

Git Process Dialog basic worked but can't catch git clone output
authorFrank Li <lznuaa@gmail.com>
Sun, 21 Dec 2008 09:21:46 +0000 (17:21 +0800)
committerFrank Li <lznuaa@gmail.com>
Sun, 21 Dec 2008 09:24:20 +0000 (17:24 +0800)
src/Git/Git.cpp
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/ProgressDlg.cpp [new file with mode: 0644]
src/TortoiseProc/ProgressDlg.h [new file with mode: 0644]

index fd69d74..2c49c72 100644 (file)
@@ -38,7 +38,7 @@ int CGit::RunAsync(CString cmd,PROCESS_INFORMATION *piOut,HANDLE *hReadOut)
        si.wShowWindow=SW_HIDE;\r
        si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;\r
 \r
-       if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))\r
+       if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), &sa,&sa,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))\r
        {\r
                LPVOID lpMsgBuf;\r
                FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,\r
index 06febcf..330aecc 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
diff --git a/src/TortoiseProc/ProgressDlg.cpp b/src/TortoiseProc/ProgressDlg.cpp
new file mode 100644 (file)
index 0000000..c18d456
--- /dev/null
@@ -0,0 +1,175 @@
+// ProgressDlg.cpp : implementation file\r
+//\r
+\r
+#include "stdafx.h"\r
+#include "TortoiseProc.h"\r
+#include "ProgressDlg.h"\r
+#include "Git.h"\r
+#include "atlconv.h"\r
+// CProgressDlg dialog\r
+\r
+IMPLEMENT_DYNAMIC(CProgressDlg, CResizableStandAloneDialog)\r
+\r
+CProgressDlg::CProgressDlg(CWnd* pParent /*=NULL*/)\r
+       : CResizableStandAloneDialog(CProgressDlg::IDD, pParent)\r
+{\r
+\r
+}\r
+\r
+CProgressDlg::~CProgressDlg()\r
+{\r
+       if(m_pThread != NULL)\r
+       {\r
+               delete m_pThread;\r
+       }\r
+}\r
+\r
+void CProgressDlg::DoDataExchange(CDataExchange* pDX)\r
+{\r
+       CDialog::DoDataExchange(pDX);\r
+       DDX_Control(pDX, IDC_CURRENT, this->m_CurrentWork);\r
+       DDX_Control(pDX, IDC_TITLE_ANIMATE, this->m_Animate);\r
+       DDX_Control(pDX, IDC_RUN_PROGRESS, this->m_Progress);\r
+       DDX_Control(pDX, IDC_LOG, this->m_Log);\r
+}\r
+\r
+\r
+BEGIN_MESSAGE_MAP(CProgressDlg, CResizableStandAloneDialog)\r
+END_MESSAGE_MAP()\r
+\r
+BOOL CProgressDlg::OnInitDialog()\r
+{\r
+       CResizableStandAloneDialog::OnInitDialog();\r
+\r
+       AddAnchor(IDC_TITLE_ANIMATE, TOP_LEFT, TOP_RIGHT);\r
+       AddAnchor(IDC_RUN_PROGRESS, TOP_LEFT,TOP_RIGHT);\r
+       AddAnchor(IDC_LOG, TOP_LEFT,BOTTOM_RIGHT);\r
+\r
+       AddAnchor(IDOK,BOTTOM_RIGHT);\r
+       AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
+\r
+       m_Animate.Open(IDR_DOWNLOAD);\r
+       \r
+       m_Log.SetWindowTextW(this->m_GitCmd+_T("\r\n\r\n"));\r
+       m_CurrentWork.SetWindowTextW(_T(""));\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 = FALSE;\r
+               m_pThread->ResumeThread();\r
+       }\r
+       return TRUE;\r
+}\r
+\r
+UINT CProgressDlg::ProgressThreadEntry(LPVOID pVoid)\r
+{\r
+       return ((CProgressDlg*)pVoid)->ProgressThread();\r
+}\r
+\r
+UINT CProgressDlg::ProgressThread()\r
+{\r
+       PROCESS_INFORMATION pi;\r
+       HANDLE hRead;\r
+\r
+       m_Animate.Play(0,-1,-1);\r
+\r
+       g_Git.RunAsync(this->m_GitCmd,&pi, &hRead);\r
+       this->DialogEnableWindow(IDOK,FALSE);\r
+\r
+       DWORD readnumber;\r
+       char buffer[2];\r
+       CString output;\r
+       while(ReadFile(hRead,buffer,1,&readnumber,NULL))\r
+       {\r
+               buffer[readnumber]=0;\r
+               ParserCmdOutput((TCHAR)buffer[0]);\r
+       }\r
+\r
+       CloseHandle(pi.hThread);\r
+\r
+       WaitForSingleObject(pi.hProcess, INFINITE);\r
+       m_GitStatus =0;\r
+\r
+       if(!GetExitCodeProcess(pi.hProcess,&m_GitStatus))\r
+       {\r
+               return GIT_ERROR_GET_EXIT_CODE;\r
+       }\r
+\r
+       CloseHandle(pi.hProcess);\r
+\r
+       CloseHandle(hRead);\r
+\r
+       m_Progress.SetPos(100);\r
+       this->DialogEnableWindow(IDOK,TRUE);\r
+\r
+       m_Animate.Stop();\r
+       return 0;\r
+}\r
+\r
+int CProgressDlg::FindPercentage(CString &log)\r
+{\r
+       int s1=log.Find(_T('%'));\r
+       if(s1<0)\r
+               return -1;\r
+\r
+       int s2=s1-1;\r
+       for(int i=s1-1;i>=0;i--)\r
+       {\r
+               if(log[i]>=_T('0') && log[i]<=_T('9'))\r
+                       s2=i;\r
+               else\r
+                       break;\r
+       }\r
+       return _ttol(log.Mid(s2,s1-s2));\r
+}\r
+\r
+void CProgressDlg::ParserCmdOutput(TCHAR ch)\r
+{\r
+       TRACE(_T("%c"),ch);\r
+       if( ch == _T('\r') || ch == _T('\n'))\r
+       {\r
+               TRACE(_T("End Char %s \r\n"),ch==_T('\r')?_T("lf"):_T(""));\r
+               TRACE(_T("End Char %s \r\n"),ch==_T('\n')?_T("cr"):_T(""));\r
+\r
+               CString text;\r
+               m_Log.GetWindowTextW(text);\r
+               if(ch == _T('\r'))\r
+               {\r
+                       RemoveLastLine(text);\r
+               }\r
+               text+=_T("\r\n")+m_LogText;\r
+               m_Log.SetWindowTextW(text);\r
+               \r
+               int s1=m_LogText.Find(_T(':'));\r
+               int s2=m_LogText.Find(_T('%'));\r
+               if(s1>0 && s2>0)\r
+               {\r
+                       this->m_CurrentWork.SetWindowTextW(m_LogText.Left(s1));\r
+                       int pos=FindPercentage(m_LogText);\r
+                       TRACE(_T("Pos %d\r\n"),pos);\r
+                       if(pos>0)\r
+                               this->m_Progress.SetPos(pos);\r
+               }\r
+\r
+               m_LogText=_T("");\r
+\r
+       }else\r
+       {\r
+               m_LogText+=ch;\r
+       }\r
+\r
+}\r
+void CProgressDlg::RemoveLastLine(CString &str)\r
+{\r
+       int start;\r
+       start=str.ReverseFind(_T('\n'));\r
+       if(start>0);\r
+               str=str.Left(start);\r
+       return;\r
+}\r
+// CProgressDlg message handlers\r
diff --git a/src/TortoiseProc/ProgressDlg.h b/src/TortoiseProc/ProgressDlg.h
new file mode 100644 (file)
index 0000000..182afa5
--- /dev/null
@@ -0,0 +1,37 @@
+#pragma once\r
+\r
+#include "StandAloneDlg.h"\r
+\r
+// CProgressDlg dialog\r
+\r
+class CProgressDlg : public CResizableStandAloneDialog\r
+{\r
+       DECLARE_DYNAMIC(CProgressDlg)\r
+\r
+public:\r
+       CProgressDlg(CWnd* pParent = NULL);   // standard constructor\r
+       virtual ~CProgressDlg();\r
+       virtual BOOL OnInitDialog();\r
+// Dialog Data\r
+       enum { IDD = IDD_GITPROGRESS };\r
+       CString m_GitCmd;\r
+       CProgressCtrl m_Progress;\r
+       \r
+       CEdit             m_Log;\r
+       CAnimateCtrl  m_Animate;\r
+       CStatic           m_CurrentWork;\r
+       CWinThread*                             m_pThread;      \r
+       volatile LONG                   m_bThreadRunning;\r
+       DWORD                     m_GitStatus;\r
+protected:\r
+       virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support\r
+       static UINT ProgressThreadEntry(LPVOID pVoid);\r
+       UINT            ProgressThread();\r
+\r
+       void            ParserCmdOutput(TCHAR ch);\r
+       int                     FindPercentage(CString &log);\r
+       void        RemoveLastLine(CString &str);\r
+\r
+       CString         m_LogText;\r
+       DECLARE_MESSAGE_MAP()\r
+};\r