On Friday, May 31, 2013 8:58:06 AM UTC+2, Jason Smith wrote:

> Hi All, 
>
> Currently I am looking at a way to redirect standard output and error from 
> git. 
>
> What I am finding is that when I call something like "git fetch 
> g...@github.com:username/project.git" there is a challenge for the ssh 
> passphrase waiting on the console. When I do this via a "CreateProcess" in 
> an application and try to redirect the output to another location I don't 
> see the output come through the pipe I have setup. Has this been seen 
> before and is there a way to fix this? Currently haven't been able to find 
> something in the archive, or on google about it. 
>
> The test code I am using is listed below. As a test you can make the 
> command anything which returns a large amount of text and this is returned 
> to the calling application. E.g. ipconfig. Note that the working directory 
> needs to be change to something which exists, and already contains the 
> project being fetched. 
>
>
> ##### CODE ######
>
> #define _WIN32_WINNT _WIN32_WINNT_WIN7
> #include <windows.h>
> #include <stdio.h>
> #include <string>
> #include <iostream>
>
> void launch(const char * cmdline_in)
> {
>     PROCESS_INFORMATION processInfo;
>     STARTUPINFOA startupInfo; 
>     SECURITY_ATTRIBUTES saAttr; 
>
>     HANDLE stdoutReadHandle = NULL;
>     HANDLE stdoutWriteHandle = NULL;
>
>     char cmdline[256];
>     char outbuf[32768];
>     DWORD bytes_read;
>     char tBuf[257];
>
>     DWORD exitcode;
>
>     strcpy_s(cmdline, sizeof(cmdline), cmdline_in);
>
>     memset(&saAttr, 0, sizeof(saAttr));
>     saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
>     saAttr.bInheritHandle = TRUE; 
>     saAttr.lpSecurityDescriptor = NULL; 
>
>     // Create a pipe for the child process's STDOUT. 
>     if (!CreatePipe(&stdoutReadHandle, &stdoutWriteHandle, &saAttr, 5000))
>     {
>         printf("CreatePipe: %u\n", GetLastError());
>         return;
>     }
>
>     // Ensure the read handle to the pipe for STDOUT is not inherited.
>     if (!SetHandleInformation(stdoutReadHandle, HANDLE_FLAG_INHERIT, 0))
>     {
>         printf("SetHandleInformation: %u\n", GetLastError());
>         return;
>     }
>
>     memset(&startupInfo, 0, sizeof(startupInfo));
>     startupInfo.cb = sizeof(startupInfo);
> startupInfo.hStdError = stdoutWriteHandle;
>     startupInfo.hStdOutput = stdoutWriteHandle;
>     startupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
>     startupInfo.dwFlags |= STARTF_USESTDHANDLES;
>
>     // memset(&processInfo, 0, sizeof(processInfo));  // Not actually 
> necessary
>
>     printf("Starting.\n");
>
>     if (!CreateProcessA(NULL, cmdline, NULL, NULL, TRUE,
>         CREATE_NO_WINDOW, NULL, "C:\\SourceDirectory\\", &startupInfo, 
> &processInfo))
>     {
> printf("Create Process Failed %u\n", GetLastError());
>         return;
>     }
>
>     printf("Close Handle\n");
>     CloseHandle(stdoutWriteHandle);
>
>     strcpy_s(outbuf, sizeof(outbuf), "");
>     printf("Start of Loop\n");
>     for (;;) {
>         printf("Just before ReadFile(...)\n");
>         if (!ReadFile(stdoutReadHandle, tBuf, 256, &bytes_read, NULL))
>         {
>             printf("ReadFile: %u\n", GetLastError());
>             break;
>         }
>         printf("Just after ReadFile, read %u byte(s)\n", bytes_read);
>         if (bytes_read > 0)
>         {
>             tBuf[bytes_read] = '\0';
>             strcat_s(outbuf, sizeof(outbuf), tBuf);
>         }
> Sleep(1);
>     }
>
>     printf("Output: %s\n", outbuf);
>
>     if (WaitForSingleObject(processInfo.hProcess, INFINITE) != 
> WAIT_OBJECT_0)
>     {
>         printf("WaitForSingleObject: %u\n", GetLastError());
>         return;
>     }
>
>     if (!GetExitCodeProcess(processInfo.hProcess, &exitcode))
>     {
>         printf("GetExitCodeProcess: %u\n", GetLastError());
>         return;
>     }
>
>     printf("Exit code: %u\n", exitcode);
>
>     CloseHandle( processInfo.hProcess );
>     CloseHandle( processInfo.hThread );
>
>     return;
> }
>
> int main(int argc, char** argv)
> {
>     launch("C:\\Program Files (x86)\\Git\\bin\\git.exe fetch 
> https://github.com/username/project.git";);
>     std::string line;
> std::getline(std::cin, line);
>     return 0;
> }
>
>
>

I think this question would be better aimed at the Git developer mailing 
list: https://gist.github.com/tfnico/4441562

Furthermore, seeing you are embedding Git inside another program, why not 
use libgit2 <http://libgit2.github.com/> instead? It seems like they finally 
implemented SSH support <https://github.com/libgit2/libgit2/pull/1558>.

-- 
You received this message because you are subscribed to the Google Groups "Git 
for human beings" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to git-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to