OSDN Git Service

Get Log From Git
[tortoisegit/TortoiseGitJp.git] / Git / Git.cpp
1 #include "StdAfx.h"\r
2 #include "Git.h"\r
3 #include "atlconv.h"\r
4 #include "afx.h"\r
5 #include "GitRev.h"\r
6 \r
7 #define MAX_DIRBUFFER 1000\r
8 CGit g_Git;\r
9 CGit::CGit(void)\r
10 {\r
11         GetCurrentDirectory(MAX_DIRBUFFER,m_CurrentDir.GetBuffer(MAX_DIRBUFFER));\r
12 }\r
13 \r
14 CGit::~CGit(void)\r
15 {\r
16 }\r
17 \r
18 char buffer[4096];\r
19 \r
20 int CGit::Run(CString cmd, CString* output)\r
21 {\r
22         SECURITY_ATTRIBUTES sa;\r
23         HANDLE hRead, hWrite;\r
24 \r
25         sa.nLength = sizeof(SECURITY_ATTRIBUTES);\r
26         sa.lpSecurityDescriptor=NULL;\r
27         sa.bInheritHandle=TRUE;\r
28         if(!CreatePipe(&hRead,&hWrite,&sa,0))\r
29         {\r
30                 return GIT_ERROR_OPEN_PIP;\r
31         }\r
32         \r
33         STARTUPINFO si;\r
34         PROCESS_INFORMATION pi;\r
35         si.cb=sizeof(STARTUPINFO);\r
36         GetStartupInfo(&si);\r
37 \r
38         si.hStdError=hWrite;\r
39         si.hStdOutput=hWrite;\r
40         si.wShowWindow=SW_HIDE;\r
41         si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;\r
42 \r
43         \r
44         if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))\r
45         {\r
46                 LPVOID lpMsgBuf;\r
47                 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,\r
48                         NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\r
49                         (LPTSTR)&lpMsgBuf,\r
50                         0,NULL);\r
51                 return GIT_ERROR_CREATE_PROCESS;\r
52         }\r
53         \r
54         CloseHandle(hWrite);\r
55 \r
56         DWORD readnumber;\r
57         while(ReadFile(hRead,buffer,4090,&readnumber,NULL))\r
58         {\r
59                 buffer[readnumber]=0;\r
60                 USES_CONVERSION;\r
61                 output->Append(A2W(buffer));\r
62         }\r
63 \r
64         \r
65         CloseHandle(pi.hThread);\r
66         CloseHandle(pi.hProcess);\r
67 \r
68         CloseHandle(hRead);\r
69         return GIT_SUCCESS;\r
70 }\r
71 \r
72 CString CGit::GetUserName(void)\r
73 {\r
74         CString UserName;\r
75         Run(_T("git.cmd config user.name"),&UserName);\r
76         return UserName;\r
77 }\r
78 CString CGit::GetUserEmail(void)\r
79 {\r
80         CString UserName;\r
81         Run(_T("git.cmd config user.email"),&UserName);\r
82         return UserName;\r
83 }\r
84 \r
85 CString CGit::GetCurrentBranch(void)\r
86 {\r
87         CString branch;\r
88         Run(_T("git.cmd branch"),&branch);\r
89         if(branch.GetLength()>0)\r
90         {\r
91                 branch.Replace(_T('*'),_T(' '));\r
92                 branch.TrimLeft();\r
93                 return branch;\r
94         }\r
95         return CString("");\r
96 }\r
97 \r
98 int CGit::GetLog(CString& logOut)\r
99 {\r
100 \r
101         CString cmd;\r
102         CString log;\r
103         cmd=("git.cmd log -C --numstat --pretty=format:\"");\r
104         log.Format(_T("#<%c>%%n"),LOG_REV_ITEM_BEGIN);\r
105         cmd += log;\r
106         log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME);\r
107         cmd += log;\r
108         log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL);\r
109         cmd += log;\r
110         log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE);\r
111         cmd += log;\r
112         log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME);\r
113         cmd += log;\r
114         log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL);\r
115         cmd += log;\r
116         log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE);\r
117         cmd += log;\r
118         log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT);\r
119         cmd += log;\r
120         log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY);\r
121         cmd += log;\r
122         log.Format(_T("#<%c>%%H%%n"),LOG_REV_COMMIT_HASH);\r
123         cmd += log;\r
124         log.Format(_T("#<%c>%%P%%n"),LOG_REV_COMMIT_PARENT);\r
125         cmd += log;\r
126         log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE);\r
127         cmd += log;\r
128         cmd += CString(_T("\""));\r
129         Run(cmd,&logOut);\r
130         return 0;\r
131 }\r