@CCRDude
Das Problem ist, dass bei einem Aufruf von "push" keine Daten über die Pipe ankommen.
Also die von mir beschriebene Ausgabe, die man eigentlich in der Konsole sehen würde (der Fortschritt usw.), kommt bei einem "push" gar nicht über die Pipe an.
Bei diesen Aufruf läuft git - je nachdem wie lange der Upload dauert - im Hintergrund, ohne das ich über die Pipe irgendwelche Daten bekomme.
Bei einem "status" oder "init" oder "add" usw. kommen die Ausgaben der Konsole in der Pipe an und ich kann diese auch entsprechend mitloggen.
Aber bei einem "push" bleibt es eben komplett leer...
Hier mal der Ausschnitt, den ich verwende:
an "Callback" wird der Inhalt der Pipe übergeben. Also die jeweilige Konsolen-Ausgabe.
Delphi-Quellcode:
saSecurity.nLength := SizeOf(TSecurityAttributes);
saSecurity.bInheritHandle := true;
saSecurity.lpSecurityDescriptor := nil;
if CreatePipe(hRead, hWrite, @saSecurity, 0) then
begin
try
FillChar(suiStartup, SizeOf(TStartupInfo), #0);
suiStartup.cb := SizeOf(TStartupInfo);
suiStartup.hStdInput := hRead;
suiStartup.hStdOutput := hWrite;
suiStartup.hStdError := hWrite;
suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
suiStartup.wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity, @saSecurity, true, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then
try
repeat
dRunning := WaitForSingleObject(piProcess.hProcess, 100);
PeekNamedPipe(hRead, nil, 0, nil, @dAvailable, nil);
if (dAvailable > 0) then
repeat
dRead := 0;
ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
pBuffer[dRead] := #0;
OemToCharA(pBuffer, dBuffer);
if Assigned(CallBack) then
begin
pOutput := string(dBuffer);
CallBack(dBuffer);
end;
until (dRead < CReadBuffer);
Application.ProcessMessages;
until (dRunning <> WAIT_TIMEOUT);
GetExitCodeProcess(piProcess.hProcess, exitcode);
finally
CloseHandle(piProcess.hProcess);
CloseHandle(piProcess.hThread);
end;
finally
CloseHandle(hRead);
CloseHandle(hWrite);
end;
end;