OSDN Git Service

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