summaryrefslogtreecommitdiff
path: root/Make.lpr
diff options
context:
space:
mode:
Diffstat (limited to 'Make.lpr')
-rw-r--r--Make.lpr189
1 files changed, 65 insertions, 124 deletions
diff --git a/Make.lpr b/Make.lpr
index 6db584d..7e7f042 100644
--- a/Make.lpr
+++ b/Make.lpr
@@ -8,7 +8,7 @@ uses
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this },
- RegExpr, Math, Process;
+ RegExpr, Math, tools;
type
@@ -24,7 +24,6 @@ type
TAbhArt = (aaFinal,aaEinsZuEins,aaNZuN,aaIgnore);
TDateienMitDaten = array of ^TDateiMitDatum;
- tStringlistBArray = array[boolean] of tStringlist;
{ TAbhaengigkeit }
@@ -97,50 +96,6 @@ begin
inherited destroy;
end;
-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('-c');
- p.Parameters.add(sumNam);
- p.Options:=p.Options + [poUsePipes];
- p.Execute;
- rb:=0;
- s:='';
- while p.Running do begin
- if p.Output.NumBytesAvailable=0 then sleep(10)
- else begin
- setlength(s,rb+leseHappen);
- rb:=rb+p.Output.Read(s[rb+1],leseHappen);
- end;
- end;
- if p.Output.NumBytesAvailable>0 then begin
- setlength(s,rb+leseHappen);
- rb:=rb+p.Output.Read(s[rb+1],leseHappen);
- end;
- 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;
begin
repeat
@@ -177,50 +132,6 @@ begin
FindClose(sr);
end;
-function anzCs(c: char; s: string): longint;
-var i: longint;
-begin
- result:=0;
- for i:=1 to length(s) do
- if s[i]=c then
- inc(result);
-end;
-
-function notQuotedPos(was,worin: string): longint;
-begin
- result:=0;
- repeat
- if pos(was,copy(worin,result+1,length(worin)-result))=0 then begin
- result:=0;
- exit;
- end;
- result:=result+pos(was,copy(worin,result+1,length(worin)-result));
- if not odd(anzCs('"',copy(worin,1,result-1))) then
- exit;
- until false;
-end;
-
-function unescapedpos(was,worin: string): integer;
-var Ebene: longint;
-begin
- result:=0;
- Ebene:=0;
- while pos(was,copy(worin,result+1,length(worin)))>0 do begin
- repeat
- result:=result+1;
- case worin[result] of
- '{': inc(Ebene);
- '}': dec(Ebene);
- end;
- until (result>=length(worin)) or ((copy(worin,result,length(was))=was) and (Ebene=0));
- if
- ((result=1) or ((worin[result-1]<>'\') and (worin[result-1]<>was))) and
- ((result=length(worin)) or (worin[result+1]<>was)) and
- (copy(worin,result,length(was))=was) then exit;
- end;
- result:=0;
-end;
-
function liesMakeFile(datNam: string; out Abh: TAbhaengigkeiten; out dats: TDateienMitDaten): boolean;
var f: textfile;
s,t: string;
@@ -360,6 +271,8 @@ begin
end;
end;
+ for gefunden:=false to true do
+ gutschlecht[gefunden].free;
result:=true;
end;
@@ -584,23 +497,24 @@ begin
mgl[length(mgl)-1]^.ZieleFkt.Text:=mgl[i]^.ZieleFkt.Text;
mgl[length(mgl)-1]^.Befehle.Text:=mgl[i]^.Befehle.Text;
end;
- for j:=0 to length(dats)-1 do if mgl[i]^.QuellenRE.Exec(dats[j]^.Name) then begin
- schonda:=false;
- for k:=0 to length(mgl[i]^.Erben[0]^.Quellen)-1 do
- schonda:=schonda or (mgl[i]^.Erben[0]^.Quellen[k]=dats[j]);
- if schonda then continue;
-
- SetLength(mgl[i]^.Erben[0]^.Quellen,length(mgl[i]^.Erben[0]^.Quellen)+1);
- mgl[i]^.Erben[0]^.Quellen[length(mgl[i]^.Erben[0]^.Quellen)-1]:=dats[j];
-
- for k:=0 to mgl[i]^.Befehle.Count-1 do begin
- s:=mgl[i]^.Befehle[k];
- 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);
+ for j:=0 to length(dats)-1 do
+ if mgl[i]^.QuellenRE.Exec(dats[j]^.Name) then begin
+ schonda:=false;
+ for k:=0 to length(mgl[i]^.Erben[0]^.Quellen)-1 do
+ schonda:=schonda or (mgl[i]^.Erben[0]^.Quellen[k]=dats[j]);
+ if schonda then continue;
+
+ SetLength(mgl[i]^.Erben[0]^.Quellen,length(mgl[i]^.Erben[0]^.Quellen)+1);
+ mgl[i]^.Erben[0]^.Quellen[length(mgl[i]^.Erben[0]^.Quellen)-1]:=dats[j];
+
+ for k:=0 to mgl[i]^.Befehle.Count-1 do begin
+ s:=mgl[i]^.Befehle[k];
+ 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;
end;
end;
- end;
end;
aaEinsZuEins: begin // jede Quelle muss einzeln behandelt werden
for j:=0 to length(dats)-1 do
@@ -609,7 +523,9 @@ begin
for k:=0 to length(mgl[i]^.Erben)-1 do
for l:=0 to length(mgl[i]^.Erben[k]^.Quellen)-1 do
schonda:=schonda or (mgl[i]^.Erben[k]^.Quellen[l]=dats[j]);
+
if schonda then continue;
+
SetLength(mgl,length(mgl)+1);
getmem(mgl[length(mgl)-1],sizeof(TAbhaengigkeit));
fillchar(mgl[length(mgl)-1]^,sizeof(TAbhaengigkeiten),0);
@@ -619,7 +535,8 @@ 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,inputfile,dats);
+ mgl[length(mgl)-1]^.ZieleFkt:=mgl[i]^.ZieleFkt;
+// findeZiele(mgl[length(mgl)-1]^.Ziele,mgl[i]^.ZieleFkt,dats[j]^.name,inputfile,dats); // sollte unten geschehen
mgl[length(mgl)-1]^.Befehle.Clear;
for k:=0 to mgl[i]^.Befehle.Count-1 do begin
s:=mgl[i]^.Befehle[k];
@@ -627,32 +544,32 @@ begin
mgl[length(mgl)-1]^.Befehle.Add(s);
end;
if mgl[length(mgl)-1]^.Befehle.Count=0 then begin
- writeln('Keine Befehle für diese Abhängigkeit auszuführen!');
+ writeln('Fehler: Keine Befehle für diese Abhängigkeit auszuführen!');
halt;
end;
mgl[length(mgl)-1]^.Prioritaet:=mgl[i]^.Prioritaet;
end;
end;
- aaFinal: if length(mgl[i]^.Erben)=0 then begin // Quellen stehen schon fest, noch nicht auszuführen
- if length(mgl[i]^.Quellen)=0 then begin
- inc(i);
- continue;
- end;
- quNeu:=mgl[i]^.Quellen[0]^.Datum;
- for j:=1 to length(mgl[i]^.Quellen)-1 do
- quNeu:=max(quNeu,mgl[i]^.Quellen[j]^.Datum);
+ aaFinal: if (length(mgl[i]^.Erben)=0) and
+ (length(mgl[i]^.Quellen)<>0) then begin // Quellen stehen schon fest, noch nicht auszuführen
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,inputfile,dats);
- if length(mgl[i]^.Ziele)=0 then begin
+ if length(mgl[i]^.Ziele)=0 then begin // immer noch keine Ziele
+ writeln('Warnung: Keine Ziele für diese Abhängigkeit!');
mgl[i]^.AbhArt:=aaIgnore;
continue;
end;
end;
+ quNeu:=mgl[i]^.Quellen[0]^.Datum;
+ for j:=1 to length(mgl[i]^.Quellen)-1 do // neueste Quelle ermitteln
+ quNeu:=max(quNeu,mgl[i]^.Quellen[j]^.Datum);
ziAlt:=mgl[i]^.Ziele[0]^.Datum;
- for j:=1 to length(mgl[i]^.Ziele)-1 do
+ for j:=1 to length(mgl[i]^.Ziele)-1 do // ältestes Ziel ermitteln
ziAlt:=min(ziAlt,mgl[i]^.Ziele[j]^.Datum);
+
if ziAlt<quNeu then begin
+ writeln(ziAlt,' ',quNeu,' ',jetzt,' ',mgl[i]^.Ziele[0]^.Name,' ',length(mgl[i]^.Ziele),' -> ',mgl[i]^.Befehle.text);
SetLength(zuTun,length(zuTun)+1);
getmem(zuTun[length(zuTun)-1],sizeof(TAbhaengigkeit));
fillchar(zuTun[length(zuTun)-1]^,sizeof(TAbhaengigkeit),0);
@@ -671,11 +588,13 @@ begin
until not neues;
end;
-procedure tueWasZuTunIst(alles,zuTun: TAbhaengigkeiten; nurAnzeigen, allesNeu: boolean; Ausgabedatei,Summendatei: string);
+procedure tueWasZuTunIst(alles,zuTun: TAbhaengigkeiten; var dats: TDateienMitDaten; nurAnzeigen, allesNeu, unsicher: boolean; Ausgabedatei,Summendatei: string);
var Prior,i,j: integer;
Ausg: Textfile;
- Befehle,geaenderteDateien,alteDateien: TStringlist;
- ms: boolean;
+ Befehle,geaenderteDateien,
+ alteDateien,sumDateien: TStringlist;
+ ms,gefunden: boolean;
+ lokTest: tRegExpr;
begin
Befehle:=TStringlist.create;
Prior:=0;
@@ -684,6 +603,19 @@ begin
Prior:=max(Prior,zuTun[i]^.Prioritaet);
if ms then begin
geaenderteDateien:=TStringlist.create;
+ sumDateien:=dateienMitGueltigerSumme(Summendatei);
+ for i:=0 to length(dats)-1 do begin
+ gefunden:=(dats[i]^.name=Summendatei) or (dats[i]^.name=Ausgabedatei);
+ for j:=0 to sumDateien.count-1 do
+ if sumDateien[j]=dats[i]^.name then begin
+ gefunden:=true;
+ sumDateien.delete(j);
+ break;
+ end;
+ if not gefunden then
+ geaenderteDateien.add(dats[i]^.name);
+ end;
+ sumDateien.free;
if allesNeu then
for i:=0 to length(alles)-1 do begin
for j:=0 to length(alles[i]^.Ziele)-1 do
@@ -705,6 +637,16 @@ begin
Befehle.Add(zuTun[i]^.Befehle[j]);
dec(Prior);
end;
+ if not unsicher then begin
+ lokTest:=tRegExpr.create;
+ if extractfilepath(Ausgabedatei)=extractfilepath(Summendatei) then
+ lokTest.Expression:='^'+extractfilepath(Ausgabedatei)+'/'
+ else
+ lokTest.Expression:='^('+extractfilepath(Ausgabedatei)+'|'+extractfilepath(Summendatei)+')/';
+ for i:=0 to Befehle.count-1 do
+ testeObBefehlLokal(Befehle[i],extractfiledir(Ausgabedatei),lokTest);
+ lokTest.free;
+ end;
if ms then begin
for i:=geaenderteDateien.count-1 downto 0 do begin
if geaenderteDateien[i]='.uralt.' then begin
@@ -739,7 +681,6 @@ begin
if length(zuTun)=0 then
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
@@ -765,7 +706,7 @@ var
mglAbhaengigkeiten,zutunAbhaengigkeiten: TAbhaengigkeiten;
Dateien: TDateienMitDaten;
begin
- ErrorMsg:=CheckOptions('A:HWD:P:a','Ausgabe: Hilfe Watte Datei: Prüfsummen: alleSummenErneuern');
+ ErrorMsg:=CheckOptions('A:HWD:P:au','Ausgabe: Hilfe Watte Datei: Prüfsummen: alleSummenErneuern unsicher');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg+#10'Hilfe: '+Exename+' -H/--Hilfe'));
Terminate;
@@ -819,7 +760,7 @@ begin
writeln('Regeln: '+inttostr(length(mglAbhaengigkeiten))+', Dateien: '+inttostr(length(Dateien)));
findeWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,Dateien,inputfile,now);
writeln('anzuwendende Regeln: '+inttostr(length(zuTunAbhaengigkeiten)));
- tueWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,HasOption('W','Watte'),HasOption('a','alleSummenErneuern'),GetOptionValue('A','Ausgabe'),pruefsummenfile);
+ tueWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,Dateien,HasOption('W','Watte'),HasOption('a','alleSummenErneuern'),HasOption('u','unsicher'),GetOptionValue('A','Ausgabe'),pruefsummenfile);
Terminate;
end;
@@ -833,7 +774,7 @@ end;
procedure TMake.WriteHelp;
begin
writeln('Verwendung:');
- writeln(' ',ExeName,' -A/--Ausgabe $Ausgabedatei -H/--Hilfe -W/--Watte -D/--Datei $Machdatei -P/--Prüfsummen $Prüfsummendatei -a/--alleSummenErneuern');
+ writeln(' ',ExeName,' -A/--Ausgabe $Ausgabedatei -H/--Hilfe -W/--Watte -D/--Datei $Machdatei -P/--Prüfsummen $Prüfsummendatei -a/--alleSummenErneuern -u/--unsicher');
end;
var