diff options
Diffstat (limited to 'Make.lpr')
-rw-r--r-- | Make.lpr | 126 |
1 files changed, 91 insertions, 35 deletions
@@ -24,6 +24,7 @@ type TAbhArt = (aaFinal,aaEinsZuEins,aaNZuN,aaIgnore); TDateienMitDaten = array of ^TDateiMitDatum; + tStringlistBArray = array[boolean] of tStringlist; { TAbhaengigkeit } @@ -96,33 +97,48 @@ begin inherited destroy; end; -function pruefsumme(datei: string): string; -var p: tProcess; - rb: longint; +function testeSummen(sumNam: string): tStringlistBArray; +var p: tProcess; + rb,i: longint; + s: string; + erg: tStringlist; + gut: boolean; const leseHappen=65536; begin p:=tProcess.create(nil); p.Executable:='/usr/bin/sha512sum'; - p.Parameters.add(datei); + p.Parameters.add('-c'); + p.Parameters.add(sumNam); p.Options:=p.Options + [poUsePipes]; p.Execute; - result:=''; rb:=0; + s:=''; while p.Running do begin if p.Output.NumBytesAvailable=0 then sleep(10) else begin - setlength(result,rb+leseHappen); - rb:=rb+p.Output.Read(result[rb+1],leseHappen); + setlength(s,rb+leseHappen); + rb:=rb+p.Output.Read(s[rb+1],leseHappen); end; end; if p.Output.NumBytesAvailable>0 then begin - setlength(result,rb+leseHappen); - rb:=rb+p.Output.Read(result[rb+1],leseHappen); + setlength(s,rb+leseHappen); + rb:=rb+p.Output.Read(s[rb+1],leseHappen); end; - setlength(result,rb); - delete(result,pos(' ',result),length(result)); - result:=trim(result); p.free; + setlength(s,rb); + erg:=tStringlist.create; + erg.text:=s; + s:=''; + for gut:=false to true do begin + result[gut]:=tStringlist.create; + rb:=0; + for i:=0 to erg.count-1 do + if not gut xor (rightStr(erg[i],4)=': OK') then begin + result[gut].add(leftStr(erg[i],pos(':',erg[i])-1)); + inc(rb); + end; + end; + erg.free; end; function liesZeile(var dat: textfile; out s: string): boolean; @@ -202,12 +218,12 @@ begin result:=0; end; -function liesMakeFile(datNam,sumNam: string; out Abh: TAbhaengigkeiten; out dats: TDateienMitDaten; jetzt: extended): boolean; +function liesMakeFile(datNam: string; out Abh: TAbhaengigkeiten; out dats: TDateienMitDaten): boolean; var f: textfile; s,t: string; NA: TAbhaengigkeit; beg,fin,rek: boolean; - wo,num,i: integer; + wo,num: integer; begin result:=false; @@ -288,29 +304,56 @@ begin closefile(f); NA.free; - if sumNam<>'' then begin + result:=true; +end; + +function liesPruefsummenfile(sumNam: string; var dats: tDateienMitDaten; jetzt: extended): boolean; +var f: textfile; + i,j: longint; + gutschlecht: tStringlistBArray; + gefunden,gut: boolean; +begin + result:=false; + if sumNam='' then exit; + + if not fileexists(sumNam) then begin assignfile(f,sumNam); - if not fileexists(sumNam) then begin - rewrite(f); - closefile(f); - end; - if not fileexists(sumNam) then - exit; - reset(f); - while not eof(f) do begin - readln(f,s); - t:=copy(s,1,pos(' ',s)-1); - delete(s,1,pos(' ',s)); - s:=trim(s); - for i:=0 to length(dats)-1 do - if s=dats[i]^.Name then begin // bekannte Dateien sind formal uralt (Prüfsumme OK) - dats[i]^.Datum:=(jetzt + 1)*byte(pruefsumme(s)<>t); // oder von morgen (Prüfsumme nicht OK) - break; - end; - end; + rewrite(f); closefile(f); end; + if not fileexists(sumNam) then + exit; + gutschlecht:=testeSummen(sumNam); + + for gut:=false to true do + for i:=0 to gutschlecht[gut].count-1 do begin + gefunden:=false; + for j:=0 to length(dats)-1 do + if dats[j]^.Name=gutschlecht[gut][i] then begin + dats[j]^.Datum:=jetzt*byte(not gut) + 1; + // Prüfsumme OK => Datei formal (ur)alt: + // -> immer überschreiben, wenn es eine Quelle ohne (gültige) Prüfsumme gibt oder diese entstehen wird + // -> von sich aus nie Auslöser für Kompilation (außer eines der Ziele existiert nicht) + // Prüfsumme nicht OK => Datei formal von morgen: + // -> löst Kompilation aus, wenn es eine Quelle ist + // -> wird weiterhin durch Kompilation als Ziel erneuert + gefunden:=true; + break; + end; + if not gefunden then begin + if not gut then begin // Dateien mit ungültiger Prüfsumme können auch nicht vorhanden sein, + setlength(dats,length(dats)+1); // dann werden sie einfach eingefügt + getmem(dats[length(dats)-1],sizeof(tDateiMitDatum)); + dats[length(dats)-1]^.Name:=gutschlecht[gut][i]; + dats[length(dats)-1]^.Datum:=0; // siehe oben + continue; + end; + for gefunden:=false to true do + gutschlecht[gefunden].free; + exit; + end; + end; result:=true; end; @@ -658,12 +701,17 @@ begin dec(Prior); end; if ms then begin - for i:=geaenderteDateien.count-1 downto 0 do + for i:=geaenderteDateien.count-1 downto 0 do begin + if geaenderteDateien[i]='.uralt.' then begin + geaenderteDateien.delete(i); + continue; + end; for j:=0 to i-1 do if geaenderteDateien[i]=geaenderteDateien[j] then begin geaenderteDateien.Delete(i); break; end; + end; if geaenderteDateien.count>0 then Befehle.Add('echo -ne "Sha512summen erneuern ..."'); for i:=0 to geaenderteDateien.count-1 do @@ -688,6 +736,7 @@ begin Befehle.Add('echo "Es gibt hier nichts zu tun!"'); Befehle.Add('sleep 2'); if nurAnzeigen then begin + writeln('Befehle:'); for i:=0 to Befehle.Count-1 do writeln(Befehle[i]); end @@ -743,7 +792,7 @@ begin end; if fileexists(inputfile) then begin - if not liesMakeFile(inputfile,pruefsummenfile,mglAbhaengigkeiten,Dateien,now) then begin + if not liesMakeFile(inputfile,mglAbhaengigkeiten,Dateien) then begin ShowException(Exception.Create('Datei '''+inputfile+''' ist fehlerhaft!')); Terminate; Exit; @@ -755,6 +804,13 @@ begin Exit; end; + if (pruefsummenfile<>'') and + (not liesPruefsummenfile(pruefsummenfile,Dateien,now)) then begin + ShowException(Exception.Create('Datei '''+pruefsummenfile+''' ist fehlerhaft!')); + Terminate; + Exit; + end; + writeln('Regeln: '+inttostr(length(mglAbhaengigkeiten))+', Dateien: '+inttostr(length(Dateien))); findeWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,Dateien,inputfile,now); writeln('anzuwendende Regeln: '+inttostr(length(zuTunAbhaengigkeiten))); |