summaryrefslogtreecommitdiff
path: root/Make.lpr
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2014-09-17 12:20:01 +0200
committerErich Eckner <git@eckner.net>2014-09-17 12:20:01 +0200
commit4bec7ee705b23b89a934b544b96457ed985b09a1 (patch)
tree4b25073e218e28cb289011c2970dbb74cf39b217 /Make.lpr
parent39df1af298d79f06282b87033e559bbc494141fa (diff)
downloadMake-4bec7ee705b23b89a934b544b96457ed985b09a1.tar.xz
Prüfsummen repariert
Diffstat (limited to 'Make.lpr')
-rw-r--r--Make.lpr126
1 files changed, 91 insertions, 35 deletions
diff --git a/Make.lpr b/Make.lpr
index 347facb..79fe703 100644
--- a/Make.lpr
+++ b/Make.lpr
@@ -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)));