summaryrefslogtreecommitdiff
path: root/Make.lpr
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2016-05-10 11:31:40 +0200
committerErich Eckner <git@eckner.net>2016-05-10 11:31:40 +0200
commit394e27efc7906ec40f960d23095dc5aebee84fd6 (patch)
tree0bf506a085ebd01ada795d42597ede19dee6ac61 /Make.lpr
parenteb86e555f015200e3bb3ac6d839df0b6ca13248d (diff)
downloadMake-394e27efc7906ec40f960d23095dc5aebee84fd6.tar.xz
alles schön in Klassen gepackt
Diffstat (limited to 'Make.lpr')
-rw-r--r--Make.lpr426
1 files changed, 22 insertions, 404 deletions
diff --git a/Make.lpr b/Make.lpr
index 7ebbfa9..38da651 100644
--- a/Make.lpr
+++ b/Make.lpr
@@ -8,7 +8,7 @@ uses
{$ENDIF}{$ENDIF}
classes, sysUtils, custApp
{ you can add units after this },
- math, tools, lowlevelunit, dateiBeziehungen, regExpr;
+ lowlevelunit, dateiBeziehungen, systemunit;
type
@@ -21,418 +21,35 @@ type
constructor create(theOwner: tComponent); override;
end;
-function liesPruefsummenfile(sumNam: string; var dats: tDateienMitDaten): boolean;
-var
- f: textfile;
- i,j: longint;
- gutschlecht: tStringlistBArray;
- gefunden,gut: boolean;
-begin
- result:=false;
- if sumNam='' then begin
- writeln('Leerer Name als summendatei angegeben!');
- exit;
- end;
-
- if not fileexists(sumNam) then begin
- assignfile(f,sumNam);
- rewrite(f);
- closefile(f);
- end;
- if not fileexists(sumNam) then begin
- writeln('Ich bin nicht in der Lage, die bisher nicht existierende Datei '''+sumNam+''' anzulegen!');
- exit;
- end;
-
- 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
- if gut then
- dats[j].aktuell:=aAktuell
- else
- dats[j].aktuell:=aVeraltet;
- 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
- dats[length(dats)-1]:=tDateiMitDatum.create;
- dats[length(dats)-1].name:=gutschlecht[gut][i];
- dats[length(dats)-1].aktuell:=aVeraltet;
- continue;
- end;
- writeln('In der Summendatei gibt es eine Datei mit gültiger Prüfsumme, die ich nicht finden kann: '''+gutschlecht[gut][i]+'''!');
- for gefunden:=false to true do
- gutschlecht[gefunden].free;
- exit;
- end;
- end;
-
- for gefunden:=false to true do
- gutschlecht[gefunden].free;
- result:=true;
-end;
-
-procedure zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle,inputfile: string; var dats: tDateienMitDaten);
-var
- i,ebene,ende: integer;
- s,t,u: string;
- wasda: boolean;
-begin
- if pos('{',ziel)=0 then begin
- if not quellersetzung(ziel,quelle,inputfile) then exit;
- ziel:=unescape(ziel);
- i:=0;
- wasda:=false;
- while i<length(dats) do begin
- if bashMatch(ziel,dats[i].name) then begin
- wasda:=true;
- setlength(ziele,length(ziele)+1);
- ziele[length(ziele)-1]:=dats[i];
- end;
- inc(i);
- end;
- if not wasda then begin
- setlength(dats,length(dats)+1);
- dats[i]:=tDateiMitDatum.create;
- if pos('*',ziel)=0 then dats[i].name:=ziel
- else dats[i].name:='.uralt.'; // unpassende *-Muster erzeugen formal keine echte Datei
- dats[i].aktuell:=aVeraltet; // nicht existente dateien sind formal uralt
- setlength(ziele,length(ziele)+1);
- ziele[length(ziele)-1]:=dats[i];
- end;
- end
- else begin
- ende:=pos('{',ziel);
- ebene:=1;
- while (ebene>0) or (ziel[ende]<>'}') do begin
- inc(ende);
- case ziel[ende] of
- '{': inc(ebene);
- '}': dec(ebene);
- end{of case};
- end;
- s:=copy(ziel,1,pos('{',ziel)-1);
- t:=copy(ziel,pos('{',ziel)+1,ende-pos('{',ziel)-1);
- 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,inputfile,dats);
- end
- else begin
- t:=t+',';
- while unescapedpos(',',t)>0 do begin
- 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,inputfile: string; var dats: tDateienMitDaten);
-var
- i: integer;
-begin
- for i:=0 to zieleFkt.count-1 do
- zieleHinzufuegen(ziele,zieleFkt[i],quelle,inputfile,dats);
-end;
-
-procedure findeWasZuTunIst(var mgl: tAbhaengigkeiten; out zuTun: tAbhaengigkeiten; var dats: tDateienMitDaten; inputfile: string);
-var
- i,j,k,l: integer;
- neues,schonDa: boolean;
- s: string;
- tmpZiele: tDateienMitDaten;
- ziA,quA: tAktualitaet;
-begin
- setlength(zuTun,0);
- repeat
- neues:=false;
- i:=0;
- while i<length(mgl) do begin
- case mgl[i].abhArt of
- aaPrimaer:
- 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)-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]);
-
- // Falls diese Quelle schon in eine Regel einfließt, brauchen
- // wir nichts mehr zu machen, da es für jede Quelle höchstens
- // eine Regel gibt.
- if schonDa then continue;
-
- // Andernfalls müssen wir schauen, ob es zu dem ziel / den Zielen
- // der Quelle schon eine Regel gibt.
- schonDa:=false;
- setlength(tmpZiele,0);
- findeMehrZiele(tmpZiele,mgl[i].zieleFkt,dats[j].name,inputfile,dats);
-
- if length(tmpZiele)=0 then begin
- writeln('Fehler: Keine ziele für Abhängigkeit!');
- writeln('Quelle:');
- writeln(''''+dats[j].name+'''');
- writeln('Ziele:');
- for k:=0 to mgl[i].zieleFkt.count-1 do
- writeln(' '''+mgl[i].zieleFkt[k]+'''');
- halt(1);
- end;
-
- for k:=0 to length(mgl[i].erben)-1 do
- if gleicheDateinamen(mgl[i].erben[k].ziele,tmpZiele) then begin
- // es gibt schon eine Regel für die Ziele der Quelle
- schonDa:=true;
- // dann wird dieser Regel nur die Quelle hinzugefügt
- setlength(mgl[i].erben[k].quellen,length(mgl[i].erben[k].quellen)+1);
- mgl[i].erben[k].quellen[length(mgl[i].erben[k].quellen)-1]:=dats[j];
- // und womöglich die befehle generiert
- for l:=0 to mgl[i].befehle.count-1 do begin
- s:=mgl[i].befehle[l];
- if quellersetzung(s,dats[j].name,inputfile) then begin
- if l=0 then mgl[i].erben[k].befehle.clear;
- mgl[i].erben[k].befehle.add(s);
- end;
- end;
- break; // mehr Ziele sollte es ohnehin nicht geben
- end;
- if schonDa then continue;
-
- // ziel(e) ist/sind neu
- setlength(mgl,length(mgl)+1);
- mgl[length(mgl)-1]:=tAbhaengigkeit.create;
- setlength(mgl[i].erben,length(mgl[i].erben)+1);
- mgl[i].erben[length(mgl[i].erben)-1]:=mgl[length(mgl)-1];
- mgl[length(mgl)-1].abhArt:=aaFinal;
- setlength(mgl[length(mgl)-1].quellen,1);
- mgl[length(mgl)-1].quellen[0]:=dats[j];
- mgl[length(mgl)-1].zieleFkt:=mgl[i].zieleFkt;
- setlength(mgl[length(mgl)-1].ziele,length(tmpZiele));
- for i:=0 to length(tmpZiele)-1 do
- mgl[length(mgl)-1].ziele[i]:=tmpZiele[i];
- 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,inputfile) then
- mgl[length(mgl)-1].befehle.add(s);
- end;
- mgl[length(mgl)-1].prioritaet:=mgl[i].prioritaet;
- end;
- aaFinal: if (length(mgl[i].erben)=0) and
- (length(mgl[i].quellen)<>0) then begin // quellen stehen schon fest, noch nicht auszuführen
- 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 // immer noch keine ziele
- writeln('Warnung: Keine ziele für diese Abhängigkeit!');
- writeln('quellen:');
- for k:=0 to length(mgl[i].quellen)-1 do
- writeln(' '''+mgl[i].quellen[k].name+'''');
- writeln('zieleFkt:');
- for k:=0 to mgl[i].zieleFkt.count-1 do
- writeln(' '''+mgl[i].zieleFkt[k]+'''');
- writeln(' - wird fortan ignoriert.');
- mgl[i].abhArt:=aaIgnore;
- continue;
- end;
-
- quA:=aAktuell;
- for j:=0 to length(mgl[i].quellen)-1 do
- if mgl[i].quellen[j].aktuell<>aAktuell then
- quA:=aWirdErneuert;
- ziA:=aWirdErneuert;
- for j:=0 to length(mgl[i].ziele)-1 do
- ziA:=min(ziA,mgl[i].ziele[j].aktuell);
-
- if ziA<quA then begin
- writeln(ziA,' ',quA,' ',mgl[i].ziele[0].name,' ',length(mgl[i].ziele));
- writeln(' -> ',mgl[i].befehle.text);
- setlength(zuTun,length(zuTun)+1);
- zuTun[length(zuTun)-1]:=tAbhaengigkeit.create(mgl[i]);
- 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].aktuell:=aWirdErneuert;
- neues:=true;
- end;
- end;
- aaIgnore: ; // keine ziele
- end{of case};
- inc(i);
- end;
- until not neues;
-end;
-
-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,sumDateien: tStringlist;
- ms,gefunden: boolean;
- lokTest: tRegExpr;
-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;
- 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
- 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
- for j:=0 to zuTun[i].befehle.count-1 do
- 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
- 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
- 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!"');
- if nurAnzeigen then begin
- writeln('befehle:');
- for i:=0 to befehle.count-1 do
- writeln(befehle[i]);
- end
- else begin
- assignFile(ausg,ausgabedatei);
- rewrite(ausg);
- for i:=0 to befehle.count-1 do
- writeln(ausg,'('+befehle[i]+') || (read -p "Ein Fehler ist aufgetreten! ... "; exit 1)');
- closeFile(ausg);
- end;
- befehle.free;
- if ms then
- geaenderteDateien.free;
-end;
-
{ tMake }
procedure tMake.doRun;
var
- inputfile,pruefsummenfile,errorMsg: string;
- mglAbhaengigkeiten,zutunAbhaengigkeiten: tAbhaengigkeiten;
- dateien: tDateienMitDaten;
+ mach: tMach;
+ errorMsg: string;
begin
- errorMsg:=checkOptions('A:WD:P:au','Ausgabe: Watte Datei: Prüfsummen: alleSummenErneuern unsicher');
- if errorMsg<>'' then begin
- showException(exception.create(errorMsg+#10'Hilfe: '+exename+' -H/--Hilfe'));
- terminate;
- exit;
- end;
+ errorMsg:=checkOptions('A:D:P:au','Ausgabe: Datei: Prüfsummen: alleSummenErneuern unsicher',true);
+ if errorMsg<>'' then
+ fehler(errorMsg+#10'Hilfe: man Make');
- if (getOptionValue('A','Ausgabe')='') and not hasOption('W','Watte') then begin
- showException(exception.create('Ausgabedatei wird benötigt!'));
- terminate;
- exit;
- end;
-
- if hasOption('D','Datei') then inputfile:=getOptionValue('D','Datei')
- else inputfile:='Machdatei';
-
- if hasOption('P','Prüfsummen') then pruefsummenfile:=getOptionValue('P','Prüfsummen')
- else begin
- showException(exception.create('Prüfsummendatei wird benötigt!'));
- terminate;
- exit;
- end;
+ mach:=tMach.create;
- if fileexists(inputfile) then begin
- if not liesMakeFile(inputfile,mglAbhaengigkeiten,dateien) then begin
- showException(exception.create('Datei '''+inputfile+''' ist fehlerhaft!'));
- terminate;
- exit;
- end;
- end
- else begin
- showException(exception.create('Datei '''+inputfile+''' existiert nicht!'));
- terminate;
- exit;
- end;
+ if hasOption('D','Datei') then
+ mach.machDatei:=getOptionValue('D','Datei')
+ else
+ mach.machDatei:=myReadLink('Machdatei');
- if not liesPruefsummenfile(pruefsummenfile,dateien) then begin
- showException(exception.create('Datei '''+pruefsummenfile+''' ist fehlerhaft!'));
- terminate;
- exit;
- end;
+ if hasOption('P','Prüfsummen') then
+ mach.pruefsummenDatei:=getOptionValue('P','Prüfsummen')
+ else
+ mach.setzeGenerischePruefsummenDatei;
- writeln('Regeln: '+inttostr(length(mglAbhaengigkeiten))+', Dateien: '+inttostr(length(dateien)));
- findeWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,dateien,inputfile);
- writeln('anzuwendende Regeln: '+inttostr(length(zuTunAbhaengigkeiten)));
- tueWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,dateien,hasOption('W','Watte'),hasOption('a','alleSummenErneuern'),hasOption('u','unsicher'),getOptionValue('A','Ausgabe'),pruefsummenfile);
+ writeln('originale Regeln: '+inttostr(mach.anzOriAbh)+', originale Dateien: '+inttostr(mach.anzDats));
+ mach.erzeugeRegeln;
+ writeln('Regeln: '+inttostr(mach.anzMglAbh)+', Dateien: '+inttostr(mach.anzDats));
+ mach.findeWasZuTunIst;
+ writeln('anzuwendende Regeln: '+inttostr(mach.anzZtAbh));
+ mach.tueWasZuTunIst(hasOption('a','alleSummenErneuern'),hasOption('u','unsicher'),getOptionValue('A','Ausgabe'));
terminate;
end;
@@ -446,6 +63,7 @@ end;
var
application: tMake;
begin
+ __ausgabenMaske:=1;
application:=tMake.create(nil);
application.run;
application.free;