diff options
-rwxr-xr-x | Make | bin | 1359741 -> 1373158 bytes | |||
-rw-r--r-- | Make.lpr | 176 | ||||
-rw-r--r-- | Make.lps | 68 |
3 files changed, 174 insertions, 70 deletions
Binary files differ @@ -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 @@ -11,9 +11,9 @@ <IsVisibleTab Value="True"/> <EditorIndex Value="0"/> <WindowIndex Value="0"/> - <TopLine Value="637"/> - <CursorPos X="60" Y="658"/> - <UsageCount Value="30"/> + <TopLine Value="236"/> + <CursorPos X="22" Y="274"/> + <UsageCount Value="31"/> <Loaded Value="True"/> </Unit0> <Unit1> @@ -22,7 +22,7 @@ <WindowIndex Value="0"/> <TopLine Value="1"/> <CursorPos X="1" Y="1"/> - <UsageCount Value="30"/> + <UsageCount Value="31"/> <DefaultSyntaxHighlighter Value="None"/> </Unit1> <Unit2> @@ -40,123 +40,123 @@ <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="Make.lpr"/> - <Caret Line="82" Column="33" TopLine="48"/> + <Caret Line="239" Column="33" TopLine="217"/> </Position1> <Position2> <Filename Value="Make.lpr"/> - <Caret Line="96" Column="10" TopLine="62"/> + <Caret Line="658" Column="60" TopLine="635"/> </Position2> <Position3> <Filename Value="Make.lpr"/> - <Caret Line="221" Column="24" TopLine="22"/> + <Caret Line="613" Column="44" TopLine="591"/> </Position3> <Position4> <Filename Value="Make.lpr"/> - <Caret Line="1" Column="1" TopLine="1"/> + <Caret Line="353" Column="76" TopLine="333"/> </Position4> <Position5> <Filename Value="Make.lpr"/> - <Caret Line="287" Column="24" TopLine="278"/> + <Caret Line="653" Column="28" TopLine="635"/> </Position5> <Position6> <Filename Value="Make.lpr"/> - <Caret Line="1" Column="1" TopLine="1"/> + <Caret Line="287" Column="61" TopLine="281"/> </Position6> <Position7> <Filename Value="Make.lpr"/> - <Caret Line="287" Column="24" TopLine="252"/> + <Caret Line="392" Column="78" TopLine="377"/> </Position7> <Position8> <Filename Value="Make.lpr"/> - <Caret Line="354" Column="26" TopLine="343"/> + <Caret Line="436" Column="65" TopLine="415"/> </Position8> <Position9> <Filename Value="Make.lpr"/> - <Caret Line="454" Column="32" TopLine="401"/> + <Caret Line="441" Column="85" TopLine="420"/> </Position9> <Position10> <Filename Value="Make.lpr"/> - <Caret Line="1" Column="1" TopLine="1"/> + <Caret Line="448" Column="84" TopLine="431"/> </Position10> <Position11> <Filename Value="Make.lpr"/> - <Caret Line="217" Column="12" TopLine="190"/> + <Caret Line="455" Column="90" TopLine="437"/> </Position11> <Position12> <Filename Value="Make.lpr"/> - <Caret Line="107" Column="28" TopLine="44"/> + <Caret Line="498" Column="58" TopLine="478"/> </Position12> <Position13> <Filename Value="Make.lpr"/> - <Caret Line="154" Column="11" TopLine="119"/> + <Caret Line="461" Column="129" TopLine="449"/> </Position13> <Position14> <Filename Value="Make.lpr"/> - <Caret Line="158" Column="11" TopLine="123"/> + <Caret Line="522" Column="92" TopLine="501"/> </Position14> <Position15> <Filename Value="Make.lpr"/> - <Caret Line="175" Column="97" TopLine="140"/> + <Caret Line="526" Column="60" TopLine="505"/> </Position15> <Position16> <Filename Value="Make.lpr"/> - <Caret Line="217" Column="13" TopLine="204"/> + <Caret Line="546" Column="95" TopLine="525"/> </Position16> <Position17> <Filename Value="Make.lpr"/> - <Caret Line="300" Column="11" TopLine="238"/> + <Caret Line="652" Column="71" TopLine="631"/> </Position17> <Position18> <Filename Value="Make.lpr"/> - <Caret Line="369" Column="62" TopLine="335"/> + <Caret Line="656" Column="3" TopLine="635"/> </Position18> <Position19> <Filename Value="Make.lpr"/> - <Caret Line="360" Column="50" TopLine="339"/> + <Caret Line="63" Column="1" TopLine="62"/> </Position19> <Position20> <Filename Value="Make.lpr"/> - <Caret Line="288" Column="24" TopLine="280"/> + <Caret Line="656" Column="3" TopLine="635"/> </Position20> <Position21> <Filename Value="Make.lpr"/> - <Caret Line="1" Column="1" TopLine="1"/> + <Caret Line="461" Column="121" TopLine="439"/> </Position21> <Position22> <Filename Value="Make.lpr"/> - <Caret Line="288" Column="24" TopLine="253"/> + <Caret Line="639" Column="1" TopLine="626"/> </Position22> <Position23> <Filename Value="Make.lpr"/> - <Caret Line="395" Column="27" TopLine="375"/> + <Caret Line="49" Column="1" TopLine="40"/> </Position23> <Position24> <Filename Value="Make.lpr"/> - <Caret Line="439" Column="25" TopLine="408"/> + <Caret Line="458" Column="146" TopLine="416"/> </Position24> <Position25> <Filename Value="Make.lpr"/> - <Caret Line="444" Column="25" TopLine="410"/> + <Caret Line="611" Column="9" TopLine="589"/> </Position25> <Position26> <Filename Value="Make.lpr"/> - <Caret Line="451" Column="25" TopLine="432"/> + <Caret Line="635" Column="1" TopLine="633"/> </Position26> <Position27> <Filename Value="Make.lpr"/> - <Caret Line="461" Column="17" TopLine="447"/> + <Caret Line="611" Column="1" TopLine="590"/> </Position27> <Position28> <Filename Value="Make.lpr"/> - <Caret Line="525" Column="51" TopLine="504"/> + <Caret Line="638" Column="50" TopLine="627"/> </Position28> <Position29> <Filename Value="Make.lpr"/> - <Caret Line="239" Column="33" TopLine="217"/> + <Caret Line="22" Column="1" TopLine="22"/> </Position29> <Position30> <Filename Value="Make.lpr"/> - <Caret Line="658" Column="60" TopLine="635"/> + <Caret Line="638" Column="12" TopLine="619"/> </Position30> </JumpHistory> </ProjectSession> |