X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=src%2FGit%2FGit.cpp;h=26891ac2d6cd162599539dccdeb9dfeede121169;hb=2f7a7c37088674a4a7115c76af193358d65759db;hp=d0271dd979bfba76f56a6768c854f8ae5c25123d;hpb=13395a9ab9658371a4fbd34f353f1f27f88d65e8;p=tortoisegit%2FTortoiseGitJp.git diff --git a/src/Git/Git.cpp b/src/Git/Git.cpp index d0271dd..26891ac 100644 --- a/src/Git/Git.cpp +++ b/src/Git/Git.cpp @@ -15,11 +15,11 @@ CGit::~CGit(void) } char buffer[4096]; - -int CGit::Run(CString cmd, CString* output) +int CGit::RunAsync(CString cmd,PROCESS_INFORMATION *piOut,HANDLE *hReadOut,CString *StdioFile) { SECURITY_ATTRIBUTES sa; HANDLE hRead, hWrite; + HANDLE hStdioFile; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor=NULL; @@ -29,17 +29,26 @@ int CGit::Run(CString cmd, CString* output) return GIT_ERROR_OPEN_PIP; } + if(StdioFile) + { + hStdioFile=CreateFile(*StdioFile,GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, + &sa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + } + STARTUPINFO si; PROCESS_INFORMATION pi; si.cb=sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError=hWrite; - si.hStdOutput=hWrite; + if(StdioFile) + si.hStdOutput=hStdioFile; + else + si.hStdOutput=hWrite; + si.wShowWindow=SW_HIDE; si.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; - if(!CreateProcess(NULL,(LPWSTR)cmd.GetString(), NULL,NULL,TRUE,NULL,NULL,(LPWSTR)m_CurrentDir.GetString(),&si,&pi)) { LPVOID lpMsgBuf; @@ -51,6 +60,20 @@ int CGit::Run(CString cmd, CString* output) } CloseHandle(hWrite); + if(piOut) + *piOut=pi; + if(hReadOut) + *hReadOut=hRead; + + return 0; + +} +int CGit::Run(CString cmd, CString* output) +{ + PROCESS_INFORMATION pi; + HANDLE hRead; + if(RunAsync(cmd,&pi,&hRead)) + return GIT_ERROR_CREATE_PROCESS; DWORD readnumber; while(ReadFile(hRead,buffer,4090,&readnumber,NULL)) @@ -80,20 +103,20 @@ int CGit::Run(CString cmd, CString* output) CString CGit::GetUserName(void) { CString UserName; - Run(_T("git.cmd config user.name"),&UserName); + Run(_T("git.exe config user.name"),&UserName); return UserName; } CString CGit::GetUserEmail(void) { CString UserName; - Run(_T("git.cmd config user.email"),&UserName); + Run(_T("git.exe config user.email"),&UserName); return UserName; } CString CGit::GetCurrentBranch(void) { CString branch; - Run(_T("git.cmd branch"),&branch); + Run(_T("git.exe branch"),&branch); if(branch.GetLength()>0) { branch.Replace(_T('*'),_T(' ')); @@ -103,39 +126,71 @@ CString CGit::GetCurrentBranch(void) return CString(""); } -int CGit::GetLog(CString& logOut) +int CGit::BuildOutputFormat(CString &format,bool IsFull) { - - CString cmd; CString log; - cmd=("git.cmd log -C --numstat --raw --pretty=format:\""); log.Format(_T("#<%c>%%n"),LOG_REV_ITEM_BEGIN); - cmd += log; - log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME); - cmd += log; - log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL); - cmd += log; - log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE); - cmd += log; - log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME); - cmd += log; - log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL); - cmd += log; - log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE); - cmd += log; - log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT); - cmd += log; - log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY); - cmd += log; + format += log; + if(IsFull) + { + log.Format(_T("#<%c>%%an%%n"),LOG_REV_AUTHOR_NAME); + format += log; + log.Format(_T("#<%c>%%ae%%n"),LOG_REV_AUTHOR_EMAIL); + format += log; + log.Format(_T("#<%c>%%ai%%n"),LOG_REV_AUTHOR_DATE); + format += log; + log.Format(_T("#<%c>%%cn%%n"),LOG_REV_COMMIT_NAME); + format += log; + log.Format(_T("#<%c>%%ce%%n"),LOG_REV_COMMIT_EMAIL); + format += log; + log.Format(_T("#<%c>%%ci%%n"),LOG_REV_COMMIT_DATE); + format += log; + log.Format(_T("#<%c>%%s%%n"),LOG_REV_COMMIT_SUBJECT); + format += log; + log.Format(_T("#<%c>%%b%%n"),LOG_REV_COMMIT_BODY); + format += log; + } log.Format(_T("#<%c>%%H%%n"),LOG_REV_COMMIT_HASH); - cmd += log; + format += log; log.Format(_T("#<%c>%%P%%n"),LOG_REV_COMMIT_PARENT); + format += log; + + if(IsFull) + { + log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE); + format += log; + } + return 0; +} + +int CGit::GetLog(CString& logOut, CString &hash, int count) +{ + + CString cmd; + CString log; + CString num; + CString since; + if(count>0) + num.Format(_T("-n%d"),count); + + cmd.Format(_T("git.exe log %s -C --numstat --raw --pretty=format:\""), + num); + BuildOutputFormat(log); cmd += log; - log.Format(_T("#<%c>%%n"),LOG_REV_COMMIT_FILE); + cmd += CString(_T("\" "))+hash; + return Run(cmd,&logOut); +} + + +int CGit::GetShortLog(CString &logOut) +{ + CString cmd; + CString log; + cmd=("git.exe log --topo-order -n100 --pretty=format:\""); + BuildOutputFormat(log,false); cmd += log; - cmd += CString(_T("\"")); - Run(cmd,&logOut); - return 0; + cmd += CString(_T("\" HEAD~40..HEAD")); + return Run(cmd,&logOut); } #define BUFSIZE 512 @@ -225,10 +280,117 @@ git_revnum_t CGit::GetHash(CString &friendname) { CString cmd; CString out; - cmd.Format(_T("git.cmd rev-parse %s" ),friendname); + cmd.Format(_T("git.exe rev-parse %s" ),friendname); Run(cmd,&out); int pos=out.ReverseFind(_T('\n')); if(pos>0) return out.Left(pos); return out; +} + +int CGit::GetTagList(CStringList &list) +{ + int ret; + CString cmd,output; + cmd=_T("git.exe tag -l"); + int i=0; + ret=g_Git.Run(cmd,&output); + if(!ret) + { + int pos=0; + CString one; + while( pos>=0 ) + { + i++; + one=output.Tokenize(_T("\n"),pos); + list.AddTail(one); + } + } + return ret; +} + +int CGit::GetBranchList(CStringList &list,int *current,BRANCH_TYPE type) +{ + int ret; + CString cmd,output; + cmd=_T("git.exe branch"); + + if(type==(BRANCH_LOCAL|BRANCH_REMOTE)) + cmd+=_T(" -a"); + else if(type==BRANCH_REMOTE) + cmd+=_T(" -r"); + + int i=0; + ret=g_Git.Run(cmd,&output); + if(!ret) + { + int pos=0; + CString one; + while( pos>=0 ) + { + i++; + one=output.Tokenize(_T("\n"),pos); + list.AddTail(one.Right(one.GetLength()-2)); + if(one[0] == _T('*')) + if(current) + *current=i; + } + } + return ret; +} + +int CGit::GetRemoteList(CStringList &list) +{ + int ret; + CString cmd,output; + cmd=_T("git.exe config --get-regexp remote.*.url"); + ret=g_Git.Run(cmd,&output); + if(!ret) + { + int pos=0; + CString one; + while( pos>=0 ) + { + one=output.Tokenize(_T("\n"),pos); + int start=one.Find(_T("."),0); + if(start>0) + { + CString url; + url=one.Right(one.GetLength()-start-1); + one=url; + one=one.Left(one.Find(_T("."),0)); + list.AddTail(one); + } + } + } + return ret; +} + +int CGit::GetMapHashToFriendName(MAP_HASH_NAME &map) +{ + int ret; + CString cmd,output; + cmd=_T("git show-ref"); + ret=g_Git.Run(cmd,&output); + if(!ret) + { + int pos=0; + CString one; + while( pos>=0 ) + { + one=output.Tokenize(_T("\n"),pos); + int start=one.Find(_T(" "),0); + if(start>0) + { + CString name; + name=one.Right(one.GetLength()-start-1); + + CString hash; + hash=one.Left(start); + + map[hash].push_back(name); + } + } + } + return ret; } \ No newline at end of file