unit gitupdateunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type tGitUpdateThread = class(tThread) private gitVerzeichnis: string; nummer: longint; fertig,upgedatet: boolean; public constructor create(num: longint); procedure execute; override; end; implementation uses process, systemunit, lowlevelunit, refreshExecutableUnit; var gitVerzeichnisse: tStringArray; // tGitUpdateThread ************************************************************ constructor tGitUpdateThread.create(num: longint); begin inherited create(true); gitVerzeichnis:=extractFilePath(paramstr(0)); case num of 0: ; 1: begin delete(gitVerzeichnis,length(gitVerzeichnis),1); gitVerzeichnis:=extractFilePath(gitVerzeichnis)+'units/'; end else fehler('Gitverzeichnis Nummer '+intToStr(num)+' ist mir unbekannt!'); end{of case}; gitVerzeichnisse[num]:=gitVerzeichnis; fertig:=false; nummer:=num; upgedatet:=false; suspended:=false; end; procedure tGitUpdateThread.execute; var args: tStringArray; output,remote: string; p: tProcess; dummy: array of byte; timeOut: extended; begin setLength(args,1); args[0]:='remote'; if runCommandInDir(gitVerzeichnis,'git',args,output) then begin while pos(#13,output)>0 do output[pos(#13,output)]:=#10; while length(output)>0 do begin remote:=erstesArgument(output,#10); if remote='' then continue; p:=tProcess.create(nil); p.executable:='git'; p.parameters.add('pull'); p.parameters.add('--ff-only'); p.parameters.add('-v'); p.parameters.add('--progress'); p.parameters.add(remote); p.options:=[poUsePipes]; setLength(dummy,1024); p.execute; timeOut:=now; p.closeInput; while (timeOut+10/24/60/60 > now) and p.running do begin if p.output.numBytesAvailable>0 then begin p.output.read(dummy[0],length(dummy)); timeOut:=now; continue; end; if p.stderr.numBytesAvailable>0 then begin p.stderr.read(dummy[0],length(dummy)); timeOut:=now; continue; end; sleep(10); end; p.closeOutput; p.closeStderr; p.free; end; end; setLength(args,0); setLength(dummy,0); upgedatet:=sourceSha512Sum(gitVerzeichnis)<>binarySha512Sum(nummer); fertig:=true; end; var gitUpdateThreads: array of tGitUpdateThread; fertig,upgedatet: boolean; i: longint; initialization setLength(gitUpdateThreads,2); setLength(gitVerzeichnisse,length(gitUpdateThreads)); for i:=0 to length(gitUpdateThreads)-1 do gitUpdateThreads[i]:=tGitUpdateThread.create(i); repeat fertig:=true; upgedatet:=false; for i:=0 to length(gitUpdateThreads)-1 do begin fertig:=fertig and gitUpdateThreads[i].fertig; upgedatet:=upgedatet or gitUpdateThreads[i].upgedatet; end; if not fertig then sleep(10); until fertig; for i:=0 to length(gitUpdateThreads)-1 do gitUpdateThreads[i].free; if upgedatet then refreshExecutable(gitVerzeichnisse); end.