6 #define MAX_DIRBUFFER 1000
\r
10 GetCurrentDirectory(MAX_DIRBUFFER,m_CurrentDir.GetBuffer(MAX_DIRBUFFER));
\r
18 int CGit::RunAsync(CString cmd,PROCESS_INFORMATION *piOut,HANDLE *hReadOut,CString *StdioFile)
\r
20 SECURITY_ATTRIBUTES sa;
\r
21 HANDLE hRead, hWrite;
\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
29 return GIT_ERROR_OPEN_PIP;
\r
34 hStdioFile=CreateFile(*StdioFile,GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,
\r
35 &sa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
\r
39 PROCESS_INFORMATION pi;
\r
40 si.cb=sizeof(STARTUPINFO);
\r
41 GetStartupInfo(&si);
\r
43 si.hStdError=hWrite;
\r
45 si.hStdOutput=hStdioFile;
\r
47 si.hStdOutput=hWrite;
\r
49 si.wShowWindow=SW_HIDE;
\r
50 si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
\r
52 if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))
\r
55 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
\r
56 NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
\r
59 return GIT_ERROR_CREATE_PROCESS;
\r
62 CloseHandle(hWrite);
\r
71 int CGit::Run(CString cmd, CString* output)
\r
73 PROCESS_INFORMATION pi;
\r
75 if(RunAsync(cmd,&pi,&hRead))
\r
76 return GIT_ERROR_CREATE_PROCESS;
\r
79 while(ReadFile(hRead,buffer,4090,&readnumber,NULL))
\r
81 buffer[readnumber]=0;
\r
83 output->Append(A2W(buffer));
\r
87 CloseHandle(pi.hThread);
\r
89 WaitForSingleObject(pi.hProcess, INFINITE);
\r
92 if(!GetExitCodeProcess(pi.hProcess,&exitcode))
\r
94 return GIT_ERROR_GET_EXIT_CODE;
\r
97 CloseHandle(pi.hProcess);
\r
103 CString CGit::GetUserName(void)
\r
106 Run(_T("git.exe config user.name"),&UserName);
\r
109 CString CGit::GetUserEmail(void)
\r
112 Run(_T("git.exe config user.email"),&UserName);
\r
116 CString CGit::GetCurrentBranch(void)
\r
119 Run(_T("git.exe branch"),&branch);
\r
120 if(branch.GetLength()>0)
\r
122 branch.Replace(_T('*'),_T(' '));
\r
126 return CString("");
\r
129 int CGit::BuildOutputFormat(CString &format,bool IsFull)
\r
132 log.Format(_T("#<%c>%%n"),LOG_REV_ITEM_BEGIN);
\r
136 log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME);
\r
138 log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL);
\r
140 log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE);
\r
142 log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME);
\r
144 log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL);
\r
146 log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE);
\r
148 log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT);
\r
150 log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY);
\r
153 log.Format(_T("#<%c>%%H%%n"),LOG_REV_COMMIT_HASH);
\r
155 log.Format(_T("#<%c>%%P%%n"),LOG_REV_COMMIT_PARENT);
\r
160 log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE);
\r
166 int CGit::GetLog(CString& logOut, CString &hash, int count)
\r
174 num.Format(_T("-n%d"),count);
\r
176 cmd.Format(_T("git.exe log %s -C --numstat --raw --pretty=format:\""),
\r
178 BuildOutputFormat(log);
\r
180 cmd += CString(_T("\" "))+hash;
\r
181 return Run(cmd,&logOut);
\r
185 int CGit::GetShortLog(CString &logOut,CTGitPath * path, int count)
\r
194 cmd.Format(_T("git.exe log --topo-order -n%d --pretty=format:\""),n);
\r
195 BuildOutputFormat(log,false);
\r
196 cmd += log+_T("\"");
\r
198 cmd+= _T(" -- \"")+path->GetGitPathString()+_T("\"");
\r
199 //cmd += CString(_T("\" HEAD~40..HEAD"));
\r
200 return Run(cmd,&logOut);
\r
203 #define BUFSIZE 512
\r
204 void GetTempPath(CString &path)
\r
206 TCHAR lpPathBuffer[BUFSIZE];
\r
208 DWORD dwBufSize=BUFSIZE;
\r
209 dwRetVal = GetTempPath(dwBufSize, // length of the buffer
\r
210 lpPathBuffer); // buffer for path
\r
211 if (dwRetVal > dwBufSize || (dwRetVal == 0))
\r
215 path.Format(_T("%s"),lpPathBuffer);
\r
217 CString GetTempFile()
\r
219 TCHAR lpPathBuffer[BUFSIZE];
\r
221 DWORD dwBufSize=BUFSIZE;
\r
222 TCHAR szTempName[BUFSIZE];
\r
225 dwRetVal = GetTempPath(dwBufSize, // length of the buffer
\r
226 lpPathBuffer); // buffer for path
\r
227 if (dwRetVal > dwBufSize || (dwRetVal == 0))
\r
231 // Create a temporary file.
\r
232 uRetVal = GetTempFileName(lpPathBuffer, // directory for tmp files
\r
233 TEXT("Patch"), // temp file name prefix
\r
234 0, // create unique name
\r
235 szTempName); // buffer for name
\r
243 return CString(szTempName);
\r
247 int CGit::RunLogFile(CString cmd,CString &filename)
\r
249 HANDLE hRead, hWrite;
\r
252 PROCESS_INFORMATION pi;
\r
253 si.cb=sizeof(STARTUPINFO);
\r
254 GetStartupInfo(&si);
\r
256 SECURITY_ATTRIBUTES psa={sizeof(psa),NULL,TRUE};;
\r
257 psa.bInheritHandle=TRUE;
\r
259 HANDLE houtfile=CreateFile(filename,GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,
\r
260 &psa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
\r
263 si.wShowWindow=SW_HIDE;
\r
264 si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
\r
265 si.hStdOutput = houtfile;
\r
267 if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi))
\r
270 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
\r
271 NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
\r
274 return GIT_ERROR_CREATE_PROCESS;
\r
277 WaitForSingleObject(pi.hProcess,INFINITE);
\r
279 CloseHandle(pi.hThread);
\r
280 CloseHandle(pi.hProcess);
\r
281 CloseHandle(houtfile);
\r
282 return GIT_SUCCESS;
\r
286 git_revnum_t CGit::GetHash(CString &friendname)
\r
290 cmd.Format(_T("git.exe rev-parse %s" ),friendname);
\r
292 int pos=out.ReverseFind(_T('\n'));
\r
294 return out.Left(pos);
\r
298 int CGit::GetTagList(STRING_VECTOR &list)
\r
301 CString cmd,output;
\r
302 cmd=_T("git.exe tag -l");
\r
304 ret=g_Git.Run(cmd,&output);
\r
312 one=output.Tokenize(_T("\n"),pos);
\r
313 list.push_back(one);
\r
319 int CGit::GetBranchList(STRING_VECTOR &list,int *current,BRANCH_TYPE type)
\r
322 CString cmd,output;
\r
323 cmd=_T("git.exe branch");
\r
325 if(type==(BRANCH_LOCAL|BRANCH_REMOTE))
\r
327 else if(type==BRANCH_REMOTE)
\r
331 ret=g_Git.Run(cmd,&output);
\r
339 one=output.Tokenize(_T("\n"),pos);
\r
340 list.push_back(one.Right(one.GetLength()-2));
\r
341 if(one[0] == _T('*'))
\r
349 int CGit::GetRemoteList(STRING_VECTOR &list)
\r
352 CString cmd,output;
\r
353 cmd=_T("git.exe config --get-regexp remote.*.url");
\r
354 ret=g_Git.Run(cmd,&output);
\r
361 one=output.Tokenize(_T("\n"),pos);
\r
362 int start=one.Find(_T("."),0);
\r
366 url=one.Right(one.GetLength()-start-1);
\r
368 one=one.Left(one.Find(_T("."),0));
\r
369 list.push_back(one);
\r
376 int CGit::GetMapHashToFriendName(MAP_HASH_NAME &map)
\r
379 CString cmd,output;
\r
380 cmd=_T("git show-ref");
\r
381 ret=g_Git.Run(cmd,&output);
\r
388 one=output.Tokenize(_T("\n"),pos);
\r
389 int start=one.Find(_T(" "),0);
\r
393 name=one.Right(one.GetLength()-start-1);
\r
396 hash=one.Left(start);
\r
398 map[hash].push_back(name);
\r