OSDN Git Service

Auto MsysGit Path and use git.exe replace git.cmd
[tortoisegit/TortoiseGitJp.git] / src / Git / Git.cpp
1 #include "StdAfx.h"\r
2 #include "Git.h"\r
3 #include "atlconv.h"\r
4 #include "GitRev.h"\r
5 \r
6 #define MAX_DIRBUFFER 1000\r
7 CGit g_Git;\r
8 CGit::CGit(void)\r
9 {\r
10         GetCurrentDirectory(MAX_DIRBUFFER,m_CurrentDir.GetBuffer(MAX_DIRBUFFER));\r
11 }\r
12 \r
13 CGit::~CGit(void)\r
14 {\r
15 }\r
16 \r
17 char buffer[4096];\r
18 \r
19 int CGit::Run(CString cmd, CString* output)\r
20 {\r
21         SECURITY_ATTRIBUTES sa;\r
22         HANDLE hRead, hWrite;\r
23 \r
24         sa.nLength = sizeof(SECURITY_ATTRIBUTES);\r
25         sa.lpSecurityDescriptor=NULL;\r
26         sa.bInheritHandle=TRUE;\r
27         if(!CreatePipe(&hRead,&hWrite,&sa,0))\r
28         {\r
29                 return GIT_ERROR_OPEN_PIP;\r
30         }\r
31         \r
32         STARTUPINFO si;\r
33         PROCESS_INFORMATION pi;\r
34         si.cb=sizeof(STARTUPINFO);\r
35         GetStartupInfo(&si);\r
36 \r
37         si.hStdError=hWrite;\r
38         si.hStdOutput=hWrite;\r
39         si.wShowWindow=SW_HIDE;\r
40         si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;\r
41 \r
42         if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))\r
43         {\r
44                 LPVOID lpMsgBuf;\r
45                 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,\r
46                         NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\r
47                         (LPTSTR)&lpMsgBuf,\r
48                         0,NULL);\r
49                 return GIT_ERROR_CREATE_PROCESS;\r
50         }\r
51         \r
52         CloseHandle(hWrite);\r
53 \r
54         DWORD readnumber;\r
55         while(ReadFile(hRead,buffer,4090,&readnumber,NULL))\r
56         {\r
57                 buffer[readnumber]=0;\r
58                 USES_CONVERSION;\r
59                 output->Append(A2W(buffer));\r
60         }\r
61 \r
62         \r
63         CloseHandle(pi.hThread);\r
64 \r
65         WaitForSingleObject(pi.hProcess, INFINITE);\r
66         DWORD exitcode =0;\r
67 \r
68         if(!GetExitCodeProcess(pi.hProcess,&exitcode))\r
69         {\r
70                 return GIT_ERROR_GET_EXIT_CODE;\r
71         }\r
72 \r
73         CloseHandle(pi.hProcess);\r
74 \r
75         CloseHandle(hRead);\r
76         return exitcode;\r
77 }\r
78 \r
79 CString CGit::GetUserName(void)\r
80 {\r
81         CString UserName;\r
82         Run(_T("git.cmd config user.name"),&UserName);\r
83         return UserName;\r
84 }\r
85 CString CGit::GetUserEmail(void)\r
86 {\r
87         CString UserName;\r
88         Run(_T("git.cmd config user.email"),&UserName);\r
89         return UserName;\r
90 }\r
91 \r
92 CString CGit::GetCurrentBranch(void)\r
93 {\r
94         CString branch;\r
95         Run(_T("git.cmd branch"),&branch);\r
96         if(branch.GetLength()>0)\r
97         {\r
98                 branch.Replace(_T('*'),_T(' '));\r
99                 branch.TrimLeft();\r
100                 return branch;\r
101         }\r
102         return CString("");\r
103 }\r
104 \r
105 int CGit::GetLog(CString& logOut)\r
106 {\r
107 \r
108         CString cmd;\r
109         CString log;\r
110         cmd=("git.cmd log -C --numstat --raw --pretty=format:\"");\r
111         log.Format(_T("#<%c>%%n"),LOG_REV_ITEM_BEGIN);\r
112         cmd += log;\r
113         log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME);\r
114         cmd += log;\r
115         log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL);\r
116         cmd += log;\r
117         log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE);\r
118         cmd += log;\r
119         log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME);\r
120         cmd += log;\r
121         log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL);\r
122         cmd += log;\r
123         log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE);\r
124         cmd += log;\r
125         log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT);\r
126         cmd += log;\r
127         log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY);\r
128         cmd += log;\r
129         log.Format(_T("#<%c>%%H%%n"),LOG_REV_COMMIT_HASH);\r
130         cmd += log;\r
131         log.Format(_T("#<%c>%%P%%n"),LOG_REV_COMMIT_PARENT);\r
132         cmd += log;\r
133         log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE);\r
134         cmd += log;\r
135         cmd += CString(_T("\""));\r
136         Run(cmd,&logOut);\r
137         return 0;\r
138 }\r
139 \r
140 #define BUFSIZE 512\r
141 void GetTempPath(CString &path)\r
142 {\r
143         TCHAR lpPathBuffer[BUFSIZE];\r
144         DWORD dwRetVal;\r
145         DWORD dwBufSize=BUFSIZE;\r
146         dwRetVal = GetTempPath(dwBufSize,     // length of the buffer\r
147                            lpPathBuffer); // buffer for path \r
148     if (dwRetVal > dwBufSize || (dwRetVal == 0))\r
149     {\r
150         path=_T("");\r
151     }\r
152         path.Format(_T("%s"),lpPathBuffer);\r
153 }\r
154 CString GetTempFile()\r
155 {\r
156         TCHAR lpPathBuffer[BUFSIZE];\r
157         DWORD dwRetVal;\r
158     DWORD dwBufSize=BUFSIZE;\r
159         TCHAR szTempName[BUFSIZE];  \r
160         UINT uRetVal;\r
161 \r
162         dwRetVal = GetTempPath(dwBufSize,     // length of the buffer\r
163                            lpPathBuffer); // buffer for path \r
164     if (dwRetVal > dwBufSize || (dwRetVal == 0))\r
165     {\r
166         return _T("");\r
167     }\r
168          // Create a temporary file. \r
169     uRetVal = GetTempFileName(lpPathBuffer, // directory for tmp files\r
170                               TEXT("Patch"),  // temp file name prefix \r
171                               0,            // create unique name \r
172                               szTempName);  // buffer for name \r
173 \r
174 \r
175     if (uRetVal == 0)\r
176     {\r
177         return _T("");\r
178     }\r
179 \r
180         return CString(szTempName);\r
181 \r
182 }\r
183 \r
184 int CGit::RunLogFile(CString cmd,CString &filename)\r
185 {\r
186         HANDLE hRead, hWrite;\r
187 \r
188         STARTUPINFO si;\r
189         PROCESS_INFORMATION pi;\r
190         si.cb=sizeof(STARTUPINFO);\r
191         GetStartupInfo(&si);\r
192 \r
193         SECURITY_ATTRIBUTES   psa={sizeof(psa),NULL,TRUE};;   \r
194         psa.bInheritHandle=TRUE;   \r
195     \r
196         HANDLE   houtfile=CreateFile(filename,GENERIC_WRITE,FILE_SHARE_READ   |   FILE_SHARE_WRITE,   \r
197                         &psa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);   \r
198 \r
199 \r
200         si.wShowWindow=SW_HIDE;\r
201         si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;\r
202         si.hStdOutput   =   houtfile; \r
203         \r
204         if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))\r
205         {\r
206                 LPVOID lpMsgBuf;\r
207                 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,\r
208                         NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\r
209                         (LPTSTR)&lpMsgBuf,\r
210                         0,NULL);\r
211                 return GIT_ERROR_CREATE_PROCESS;\r
212         }\r
213         \r
214         WaitForSingleObject(pi.hProcess,INFINITE);   \r
215         \r
216         CloseHandle(pi.hThread);\r
217         CloseHandle(pi.hProcess);\r
218         CloseHandle(houtfile);\r
219         return GIT_SUCCESS;\r
220         return 0;\r
221 }\r
222 \r
223 git_revnum_t CGit::GetHash(CString &friendname)\r
224 {\r
225         CString cmd;\r
226         CString out;\r
227         cmd.Format(_T("git.cmd rev-parse %s" ),friendname);\r
228         Run(cmd,&out);\r
229         int pos=out.ReverseFind(_T('\n'));\r
230         if(pos>0)\r
231                 return out.Left(pos);\r
232         return out;\r
233 }