summaryrefslogtreecommitdiff
path: root/Make.lpr
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2014-09-16 13:19:22 +0200
committerErich Eckner <git@eckner.net>2014-09-16 13:19:22 +0200
commit39df1af298d79f06282b87033e559bbc494141fa (patch)
treeff34f9c80d43f436909c1b86c8d8799074ce1478 /Make.lpr
parent5994d8d97ca8f83b689d5ce8efe910eb906b2602 (diff)
downloadMake-39df1af298d79f06282b87033e559bbc494141fa.tar.xz
Prüfsummen ermöglicht
Diffstat (limited to 'Make.lpr')
-rw-r--r--Make.lpr176
1 files changed, 140 insertions, 36 deletions
diff --git a/Make.lpr b/Make.lpr
index d8769e6..347facb 100644
--- a/Make.lpr
+++ b/Make.lpr
@@ -46,10 +46,6 @@ type
Datum: TDateTime;
end;
-var
- jetzt: TDateTime;
- inputfile: string;
-
{ TAbhaengigkeit }
constructor TAbhaengigkeit.create;
@@ -100,6 +96,35 @@ begin
inherited destroy;
end;
+function pruefsumme(datei: string): string;
+var p: tProcess;
+ rb: longint;
+const leseHappen=65536;
+begin
+ p:=tProcess.create(nil);
+ p.Executable:='/usr/bin/sha512sum';
+ p.Parameters.add(datei);
+ p.Options:=p.Options + [poUsePipes];
+ p.Execute;
+ result:='';
+ rb:=0;
+ 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);
+ end;
+ end;
+ if p.Output.NumBytesAvailable>0 then begin
+ setlength(result,rb+leseHappen);
+ rb:=rb+p.Output.Read(result[rb+1],leseHappen);
+ end;
+ setlength(result,rb);
+ delete(result,pos(' ',result),length(result));
+ result:=trim(result);
+ p.free;
+end;
+
function liesZeile(var dat: textfile; out s: string): boolean;
begin
repeat
@@ -177,14 +202,15 @@ begin
result:=0;
end;
-function liesMakeFile(datNam: string; out Abh: TAbhaengigkeiten; out dats: TDateienMitDaten): boolean;
+function liesMakeFile(datNam,sumNam: string; out Abh: TAbhaengigkeiten; out dats: TDateienMitDaten; jetzt: extended): boolean;
var f: textfile;
s,t: string;
NA: TAbhaengigkeit;
beg,fin,rek: boolean;
- wo,num: integer;
+ wo,num,i: integer;
begin
result:=false;
+
NA:=TAbhaengigkeit.create;
setlength(dats,0);
setlength(Abh,0);
@@ -261,6 +287,31 @@ begin
end;
closefile(f);
NA.free;
+
+ if 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;
+ closefile(f);
+ end;
+
+
result:=true;
end;
@@ -285,7 +336,7 @@ begin
end;
end;
-function Quellersetzung(var worin: string; Quelle: string): boolean;
+function Quellersetzung(var worin: string; Quelle, inputfile: string): boolean;
var s,t: string;
i,a,e: integer;
begin
@@ -390,13 +441,13 @@ begin
RE.free;
end;
-procedure ZieleHinzufuegen(var Ziele: TDateienMitDaten; Ziel,Quelle: string; var dats: TDateienMitDaten);
+procedure ZieleHinzufuegen(var Ziele: TDateienMitDaten; Ziel,Quelle,inputfile: string; var dats: TDateienMitDaten);
var i,Anz,Ende: integer;
s,t,u: string;
wasda: boolean;
begin
if pos('{',Ziel)=0 then begin
- if not Quellersetzung(Ziel,Quelle) then exit;
+ if not Quellersetzung(Ziel,Quelle,inputfile) then exit;
Ziel:=unescape(Ziel);
i:=0;
wasda:=false;
@@ -434,32 +485,32 @@ begin
u:=copy(Ziel,Ende+1,length(Ziel));
if unescapedpos('..',t)>0 then begin
for i:=strtoint(copy(t,1,unescapedpos('..',t)-1)) to strtoint(copy(t,unescapedpos('..',t)+2,length(t))) do
- ZieleHinzufuegen(Ziele,s+inttostr(i)+u,Quelle,dats);
+ ZieleHinzufuegen(Ziele,s+inttostr(i)+u,Quelle,inputfile,dats);
end
else begin
t:=t+',';
while unescapedpos(',',t)>0 do begin
- ZieleHinzufuegen(Ziele,s+copy(t,1,unescapedpos(',',t)-1)+u,Quelle,dats);
+ ZieleHinzufuegen(Ziele,s+copy(t,1,unescapedpos(',',t)-1)+u,Quelle,inputfile,dats);
delete(t,1,unescapedpos(',',t));
end;
end;
end;
end;
-procedure findeMehrZiele(var Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle: string; var dats: TDateienMitDaten);
+procedure findeMehrZiele(var Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle,inputfile: string; var dats: TDateienMitDaten);
var i: integer;
begin
for i:=0 to ZieleFkt.Count-1 do
- ZieleHinzufuegen(Ziele,ZieleFkt[i],Quelle,dats);
+ ZieleHinzufuegen(Ziele,ZieleFkt[i],Quelle,inputfile,dats);
end;
-procedure findeZiele(out Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle: string; var dats: TDateienMitDaten);
+procedure findeZiele(out Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle,inputfile: string; var dats: TDateienMitDaten);
begin
setlength(Ziele,0);
- findeMehrZiele(Ziele,ZieleFkt,Quelle,dats);
+ findeMehrZiele(Ziele,ZieleFkt,Quelle,inputfile,dats);
end;
-procedure findeWasZuTunIst(var mgl: TAbhaengigkeiten; out zuTun: TAbhaengigkeiten; var dats: TDateienMitDaten);
+procedure findeWasZuTunIst(var mgl: TAbhaengigkeiten; out zuTun: TAbhaengigkeiten; var dats: TDateienMitDaten; inputfile: string; jetzt: extended);
var i,j,k,l: integer;
neues,schonda: boolean;
quNeu,
@@ -496,7 +547,7 @@ begin
for k:=0 to mgl[i]^.Befehle.Count-1 do begin
s:=mgl[i]^.Befehle[k];
- if Quellersetzung(s,dats[j]^.Name) then begin
+ if Quellersetzung(s,dats[j]^.Name,inputfile) then begin
if k=0 then mgl[i]^.Erben[0]^.Befehle.Clear;
mgl[i]^.Erben[0]^.Befehle.Add(s);
end;
@@ -520,11 +571,11 @@ begin
mgl[length(mgl)-1]^.AbhArt:=aaFinal;
SetLength(mgl[length(mgl)-1]^.Quellen,1);
mgl[length(mgl)-1]^.Quellen[0]:=dats[j];
- findeZiele(mgl[length(mgl)-1]^.Ziele,mgl[i]^.ZieleFkt,dats[j]^.name,dats);
+ findeZiele(mgl[length(mgl)-1]^.Ziele,mgl[i]^.ZieleFkt,dats[j]^.name,inputfile,dats);
mgl[length(mgl)-1]^.Befehle.Clear;
for k:=0 to mgl[i]^.Befehle.Count-1 do begin
s:=mgl[i]^.Befehle[k];
- if Quellersetzung(s,dats[j]^.Name) then
+ if Quellersetzung(s,dats[j]^.Name,inputfile) then
mgl[length(mgl)-1]^.Befehle.Add(s);
end;
if mgl[length(mgl)-1]^.Befehle.Count=0 then begin
@@ -544,7 +595,7 @@ begin
quNeu:=max(quNeu,mgl[i]^.Quellen[j]^.Datum);
if length(mgl[i]^.Ziele)=0 then begin
for j:=0 to length(mgl[i]^.Quellen)-1 do
- findeMehrZiele(mgl[i]^.Ziele,mgl[i]^.ZieleFkt,mgl[i]^.Quellen[j]^.Name,dats);
+ findeMehrZiele(mgl[i]^.Ziele,mgl[i]^.ZieleFkt,mgl[i]^.Quellen[j]^.Name,inputfile,dats);
if length(mgl[i]^.Ziele)=0 then begin
mgl[i]^.AbhArt:=aaIgnore;
continue;
@@ -561,7 +612,7 @@ begin
SetLength(mgl[i]^.Erben,1);
mgl[i]^.Erben[0]:=zuTun[length(zuTun)-1];
for j:=0 to length(mgl[i]^.Ziele)-1 do
- mgl[i]^.Ziele[j]^.Datum:=jetzt;
+ mgl[i]^.Ziele[j]^.Datum:=jetzt+2; // neu erzeugte Dateien sind dann formal von übermorgen
neues:=true;
end;
end;
@@ -572,15 +623,33 @@ begin
until not neues;
end;
-procedure tueWasZuTunIst(zuTun: TAbhaengigkeiten; nurAnzeigen: boolean; Ausgabedatei: string);
-var Prior,i,j: integer;
- Ausg: Textfile;
- Befehle: TStringlist;
+procedure tueWasZuTunIst(alles,zuTun: TAbhaengigkeiten; nurAnzeigen, allesNeu: boolean; Ausgabedatei,Summendatei: string);
+var Prior,i,j: integer;
+ Ausg: Textfile;
+ Befehle,geaenderteDateien,alteDateien: TStringlist;
+ ms: boolean;
begin
Befehle:=TStringlist.create;
Prior:=0;
+ ms:=Summendatei<>'';
for i:=0 to length(zuTun)-1 do
Prior:=max(Prior,zuTun[i]^.Prioritaet);
+ if ms then begin
+ geaenderteDateien:=TStringlist.create;
+ if allesNeu then
+ for i:=0 to length(alles)-1 do begin
+ for j:=0 to length(alles[i]^.Ziele)-1 do
+ geaenderteDateien.add(alles[i]^.Ziele[j]^.Name);
+ for j:=0 to length(alles[i]^.Quellen)-1 do
+ geaenderteDateien.add(alles[i]^.Quellen[j]^.Name);
+ end;
+ for i:=0 to length(zuTun)-1 do begin
+ for j:=0 to length(zuTun[i]^.Ziele)-1 do
+ geaenderteDateien.add(zuTun[i]^.Ziele[j]^.Name);
+ for j:=0 to length(zuTun[i]^.Quellen)-1 do
+ geaenderteDateien.add(zuTun[i]^.Quellen[j]^.Name);
+ end;
+ end;
while Prior>=0 do begin
for i:=0 to length(zuTun)-1 do
if zuTun[i]^.Prioritaet=Prior then
@@ -588,6 +657,33 @@ begin
Befehle.Add(zuTun[i]^.Befehle[j]);
dec(Prior);
end;
+ if ms then begin
+ for i:=geaenderteDateien.count-1 downto 0 do
+ for j:=0 to i-1 do
+ if geaenderteDateien[i]=geaenderteDateien[j] then begin
+ geaenderteDateien.Delete(i);
+ break;
+ end;
+ if geaenderteDateien.count>0 then
+ Befehle.Add('echo -ne "Sha512summen erneuern ..."');
+ for i:=0 to geaenderteDateien.count-1 do
+ Befehle.Add('/usr/bin/sha512sum '+geaenderteDateien[i]+' >> '+Summendatei);
+ if geaenderteDateien.count>0 then
+ Befehle.Add('echo " fertig"');
+ if not nurAnzeigen then begin
+ alteDateien:=tStringlist.create;
+ alteDateien.LoadFromFile(Summendatei);
+ for i:=alteDateien.Count-1 downto 0 do
+ for j:=0 to geaenderteDateien.count-1 do
+ if trim(copy(alteDateien[i],pos(' ',alteDateien[i]),length(alteDateien[i])))=geaenderteDateien[j] then begin
+ alteDateien.delete(i);
+ break;
+ end;
+ alteDateien.SaveToFile(Summendatei);
+ alteDateien.free;
+ end;
+ end;
+
if length(zuTun)=0 then
Befehle.Add('echo "Es gibt hier nichts zu tun!"');
Befehle.Add('sleep 2');
@@ -603,20 +699,21 @@ begin
Closefile(Ausg);
end;
Befehle.Free;
+ if ms then
+ geaenderteDateien.Free;
end;
{ TMake }
procedure TMake.DoRun;
var
- ErrorMsg: String;
- mglAbhaengigkeiten,
- zutunAbhaengigkeiten: TAbhaengigkeiten;
- Dateien: TDateienMitDaten;
+ inputfile,pruefsummenfile,ErrorMsg: String;
+ mglAbhaengigkeiten,zutunAbhaengigkeiten: TAbhaengigkeiten;
+ Dateien: TDateienMitDaten;
begin
- ErrorMsg:=CheckOptions('A:HWD:','Ausgabe: Hilfe Watte Datei:');
+ ErrorMsg:=CheckOptions('A:HWD:P:a','Ausgabe: Hilfe Watte Datei: Prüfsummen: alleSummenErneuern');
if ErrorMsg<>'' then begin
- ShowException(Exception.Create(ErrorMsg));
+ ShowException(Exception.Create(ErrorMsg+#10'Hilfe: '+Exename+' -H/--Hilfe'));
Terminate;
Exit;
end;
@@ -636,10 +733,17 @@ begin
if HasOption('D','Datei') then inputfile:=GetOptionValue('D','Datei')
else inputfile:='Machdatei';
- jetzt:=now;
+ if HasOption('P','Prüfsummen') then pruefsummenfile:=GetOptionValue('P','Prüfsummen')
+ else pruefsummenfile:='';
+
+ if HasOption('a','alleSummenErneuern') and (pruefsummenfile='') then begin
+ ShowException(Exception.Create('Ich kann alle Summen nur dann erneuern (-a/--alleSummenErneuern), wenn ich eine Prüfsummendatei habe (-P/--Pfrüfsummen)!'));
+ Terminate;
+ Exit;
+ end;
if fileexists(inputfile) then begin
- if not liesMakeFile(inputfile,mglAbhaengigkeiten,Dateien) then begin
+ if not liesMakeFile(inputfile,pruefsummenfile,mglAbhaengigkeiten,Dateien,now) then begin
ShowException(Exception.Create('Datei '''+inputfile+''' ist fehlerhaft!'));
Terminate;
Exit;
@@ -652,9 +756,9 @@ begin
end;
writeln('Regeln: '+inttostr(length(mglAbhaengigkeiten))+', Dateien: '+inttostr(length(Dateien)));
- findeWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,Dateien);
+ findeWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,Dateien,inputfile,now);
writeln('anzuwendende Regeln: '+inttostr(length(zuTunAbhaengigkeiten)));
- tueWasZuTunIst(zuTunAbhaengigkeiten,HasOption('W','Watte'),GetOptionValue('A','Ausgabe'));
+ tueWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,HasOption('W','Watte'),HasOption('a','alleSummenErneuern'),GetOptionValue('A','Ausgabe'),pruefsummenfile);
Terminate;
end;
@@ -668,7 +772,7 @@ end;
procedure TMake.WriteHelp;
begin
writeln('Verwendung:');
- writeln(' ',ExeName,' -A/--Ausgabe -H/--Hilfe -W/--Watte -D/--Datei');
+ writeln(' ',ExeName,' -A/--Ausgabe $Ausgabedatei -H/--Hilfe -W/--Watte -D/--Datei $Machdatei -P/--Prüfsummen $Prüfsummendatei -a/--alleSummenErneuern');
end;
var