OSDN Git Service

Experiment with retrieving full log in one git.exe call
[tortoisegit/TortoiseGitJp.git] / src / Git / Git.cpp
index 3b9ad9a..6dd0ad8 100644 (file)
@@ -106,6 +106,8 @@ static BOOL FindGitPath()
 \r
 \r
 #define MAX_DIRBUFFER 1000\r
+#define CALL_OUTPUT_READ_CHUNK_SIZE 1024\r
+\r
 CString CGit::ms_LastMsysGitDir;\r
 CGit g_Git;\r
 BOOL g_IsWingitDllload = TRUE;\r
@@ -128,6 +130,13 @@ BOOL wgEnumFiles_safe(const char *pszProjectPath, const char *pszSubPath, unsign
 \r
 BOOL CGit::IsVista()\r
 {\r
+\r
+       if( CRegStdWORD(_T("Software\\TortoiseGit\\CacheType") ) == 0)\r
+       {\r
+               g_IsWingitDllload=FALSE;\r
+               return TRUE;\r
+       }\r
+\r
        OSVERSIONINFO osvi;\r
     BOOL bIsWindowsXPorLater;\r
 \r
@@ -272,20 +281,18 @@ BOOL CGit::IsInitRepos()
 \r
        return FALSE;\r
 }\r
-int CGit::Run(CString cmd,BYTE_VECTOR *vector)\r
+int CGit::Run(CGitCall* pcall)\r
 {\r
        PROCESS_INFORMATION pi;\r
        HANDLE hRead;\r
-       if(RunAsync(cmd,&pi,&hRead))\r
+       if(RunAsync(pcall->GetCmd(),&pi,&hRead))\r
                return GIT_ERROR_CREATE_PROCESS;\r
 \r
        DWORD readnumber;\r
-       BYTE data;\r
-       while(ReadFile(hRead,&data,1,&readnumber,NULL))\r
+       BYTE data[CALL_OUTPUT_READ_CHUNK_SIZE];\r
+       while(ReadFile(hRead,data,CALL_OUTPUT_READ_CHUNK_SIZE,&readnumber,NULL))\r
        {\r
-               //g_Buffer[readnumber]=0;\r
-               vector->push_back(data);\r
-//             StringAppend(output,g_Buffer,codes);\r
+               pcall->OnOutputData(data,readnumber);\r
        }\r
 \r
        \r
@@ -303,7 +310,25 @@ int CGit::Run(CString cmd,BYTE_VECTOR *vector)
 \r
        CloseHandle(hRead);\r
        return exitcode;\r
+}\r
+class CGitCall_ByteVector : public CGitCall\r
+{\r
+public:\r
+       CGitCall_ByteVector(CString cmd,BYTE_VECTOR* pvector):CGitCall(cmd),m_pvector(pvector){}\r
+       virtual bool OnOutputData(const BYTE* data, size_t size)\r
+       {\r
+               size_t oldsize=m_pvector->size();\r
+               m_pvector->resize(m_pvector->size()+size);\r
+               memcpy(&*(m_pvector->begin()+oldsize),data,size);\r
+               return false;\r
+       }\r
+       BYTE_VECTOR* m_pvector;\r
 \r
+};\r
+int CGit::Run(CString cmd,BYTE_VECTOR *vector)\r
+{\r
+       CGitCall_ByteVector call(cmd,vector);\r
+       return Run(&call);\r
 }\r
 int CGit::Run(CString cmd, CString* output,int code)\r
 {\r
@@ -391,6 +416,13 @@ int CGit::BuildOutputFormat(CString &format,bool IsFull)
 \r
 int CGit::GetLog(BYTE_VECTOR& logOut, CString &hash,  CTGitPath *path ,int count,int mask)\r
 {\r
+       CGitCall_ByteVector gitCall(CString(),&logOut);\r
+       return GetLog(&gitCall,hash,path,count,mask);\r
+}\r
+\r
+//int CGit::GetLog(CGitCall* pgitCall, CString &hash,  CTGitPath *path ,int count,int mask)\r
+int CGit::GetLog(CGitCall* pgitCall, CString &hash, CTGitPath *path, int count, int mask)\r
+{\r
 \r
        CString cmd;\r
        CString log;\r
@@ -446,7 +478,10 @@ int CGit::GetLog(BYTE_VECTOR& logOut, CString &hash,  CTGitPath *path ,int count
        cmd += log;\r
        cmd += CString(_T("\"  "))+hash+file;\r
 \r
-       return Run(cmd,&logOut);\r
+       pgitCall->SetCmd(cmd);\r
+\r
+       return Run(pgitCall);\r
+//     return Run(cmd,&logOut);\r
 }\r
 \r
 #if 0\r