diff options
author | Erich Eckner <git@eckner.net> | 2016-05-11 08:46:14 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2016-05-11 08:46:14 +0200 |
commit | 2ac4f98eeccfa92177bcd419206ce621e0ae4535 (patch) | |
tree | 28c3be92df61b7eeaf97041f6d7b2b5ae6f1afc5 /dateibeziehungen.pas | |
parent | 98672cefe5f4033655de8d626969c5a9eb0b6ef8 (diff) | |
download | Make-2ac4f98eeccfa92177bcd419206ce621e0ae4535.tar.xz |
aufgeräumt, Fehler bei nicht passendem Überwachungsmuster
Diffstat (limited to 'dateibeziehungen.pas')
-rw-r--r-- | dateibeziehungen.pas | 241 |
1 files changed, 122 insertions, 119 deletions
diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas index 7900913..3f690bf 100644 --- a/dateibeziehungen.pas +++ b/dateibeziehungen.pas @@ -54,10 +54,14 @@ type _machDatei,_pruefsummenDatei: string; _oriAbh,_mglAbh,_ztAbh: tAbhaengigkeiten; _dats: tDateienMitDaten; + _ign: array of tRegExpr; procedure wMachDatei(md: string); procedure wPruefsummenDatei(pd: string); function liesMachDatei: boolean; function liesPruefsummenfile: boolean; + function sammleDateien(wo: string; rekursiv: boolean): longint; + procedure zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle: string); + procedure findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; quelle: string); public property machDatei: string read _machDatei @@ -78,9 +82,6 @@ type end; function quellersetzung(var worin: string; quelle, inputfile: string): boolean; -procedure sammleDateien(wo: string; rekursiv: boolean; ignoriere: array of tRegExpr; var dats: tDateienMitDaten); -procedure zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle,inputfile: string; var dats: tDateienMitDaten); -procedure findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; quelle,inputfile: string; var dats: tDateienMitDaten); implementation @@ -343,6 +344,9 @@ begin for i:=0 to length(_dats)-1 do _dats[i].free; setlength(_dats,0); + for i:=0 to length(_ign)-1 do + _ign[i].free; + setlength(_ign,0); inherited destroy; end; @@ -367,27 +371,20 @@ var f: tMyStringList; s: string; na: tAbhaengigkeit; - ignoriere: array of tRegExpr; rek: boolean; posi: longint; wasWar,wasIst: tZeilenTyp; procedure aufraeumen; -var - ii: longint; begin f.free; na.free; - for ii:=0 to length(ignoriere)-1 do - ignoriere[ii].free; - setlength(ignoriere,0); end; begin result:=false; na:=tAbhaengigkeit.create; - setlength(ignoriere,0); wasWar:=ztSuche; f:=tMyStringList.create; f.loadFromFile(machDatei); @@ -420,21 +417,25 @@ begin case wasIst of ztSuche: begin if not quellersetzung(s,'',machDatei) then begin - writeln('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!'); + gibAus('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!',3); aufraeumen; exit; end; - if pos('!',s)=1 then begin - delete(s,1,1); - s:=trim(s); - setlength(ignoriere,length(ignoriere)+1); - ignoriere[length(ignoriere)-1]:=tRegExpr.create; - ignoriere[length(ignoriere)-1].expression:=s; + if startetMit('!',s) then begin + setlength(_ign,length(_ign)+1); + _ign[length(_ign)-1]:=tRegExpr.create; + _ign[length(_ign)-1].expression:=s; end else begin rek:=startetMit('-r',s); while s<>'' do - sammleDateien(erstesArgument(s),rek,ignoriere,_dats); + if sammleDateien(erstesArgument(s),rek)=0 then begin + f.stepBack; + f.readln(s); + gibAus('Fehler: Ich habe etwas zu überwachendes nicht gefudnen ('''+s+''').',3); + aufraeumen; + exit; + end; end; end; ztBefehl: begin @@ -451,7 +452,7 @@ begin na.zieleFkt.add(erstesArgument(s)); ztQuelle: begin if not quellersetzung(s,'',machDatei) then begin - writeln('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!'); + gibAus('Fehler: Quellersetzung in '''+s+''' fehlgeschlagen!',3); aufraeumen; exit; end; @@ -462,7 +463,7 @@ begin end; if s<>'%%DATEIENDE%%' then - writeln('Interner Fehler! Die letzte Regel wird vsl. nicht beachtet!'); + gibAus('Interner Fehler! Die letzte Regel wird vsl. nicht beachtet!',3); aufraeumen; result:=true; @@ -477,7 +478,7 @@ var begin result:=false; if pruefsummenDatei='' then begin - writeln('Leerer Name als Summendatei angegeben!'); + gibAus('Fehler: Leerer Name als Summendatei angegeben!',3); exit; end; @@ -487,7 +488,7 @@ begin closefile(f); end; if not fileexists(pruefsummenDatei) then begin - writeln('Ich bin nicht in der Lage, die bisher nicht existierende Datei '''+pruefsummenDatei+''' anzulegen!'); + gibAus('Fehler: Ich bin nicht in der Lage, die bisher nicht existierende Datei '''+pruefsummenDatei+''' anzulegen!',3); exit; end; @@ -513,7 +514,7 @@ begin _dats[length(_dats)-1].aktuell:=aNichtVorhanden; continue; end; - writeln('In der Summendatei gibt es eine Datei mit gültiger Prüfsumme, die ich nicht finden kann: '''+gutschlecht[gut][i]+'''!'); + gibAus('Fehler: In der Summendatei gibt es eine Datei mit gültiger Prüfsumme, die ich nicht finden kann: '''+gutschlecht[gut][i]+'''!',3); for gefunden:=false to true do gutschlecht[gefunden].free; exit; @@ -525,6 +526,102 @@ begin result:=true; end; +function tMach.sammleDateien(wo: string; rekursiv: boolean): longint; +var + sr: tSearchRec; + err,i: longint; + weglassen: boolean; +begin + result:=0; + err:=FindFirst(wo,fareadOnly or faHidden or faSysFile or (byte(rekursiv)*faDirectory),sr); + while err=0 do begin + weglassen:=false; + for i:=0 to length(_ign)-1 do + weglassen:=weglassen or _ign[i].exec(extractfilepath(wo)+sr.name); + if not weglassen then begin + if sr.attr and faDirectory <> 0 then begin + if rekursiv and + (sr.name<>'.') and + (sr.name<>'..') then + result:=result+sammleDateien(extractfilepath(wo)+sr.name+'/*',rekursiv); + end + else begin + inc(result); + setlength(_dats,length(_dats)+1); + _dats[length(_dats)-1]:=tDateiMitDatum.create; + _dats[length(_dats)-1].name:=extractfilepath(wo)+sr.name; + _dats[length(_dats)-1].aktuell:=aVeraltet; + end; + end; + err:=FindNext(sr); + end; + findClose(sr); +end; + +procedure tMach.zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle: string); +var + i,ebene,ende: longint; + s,t,u: string; + wasda: boolean; +begin + if pos('{',ziel)=0 then begin + if not quellersetzung(ziel,quelle,machDatei) 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:=aNichtVorhanden; + 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); + end + else begin + t:=t+','; + while unescapedpos(',',t)>0 do begin + zieleHinzufuegen(ziele,s+copy(t,1,unescapedpos(',',t)-1)+u,quelle); + delete(t,1,unescapedpos(',',t)); + end; + end; + end; +end; + +procedure tMach.findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; quelle: string); +var + i: longint; +begin + for i:=0 to zieleFkt.count-1 do + zieleHinzufuegen(ziele,zieleFkt[i],quelle); +end; + procedure tMach.erzeugeRegeln; var i,j,k,l: longint; @@ -547,7 +644,7 @@ begin // Andernfalls müssen wir schauen, ob es zu dem Ziel / den Zielen // der Quelle schon eine Regel gibt. setlength(tmpZiele,0); - findeMehrZiele(tmpZiele,_oriAbh[i].zieleFkt,_dats[j].name,machDatei,_dats); + findeMehrZiele(tmpZiele,_oriAbh[i].zieleFkt,_dats[j].name); if length(tmpZiele)=0 then begin gibAus('Fehler: Keine Ziele für Abhängigkeit!',3); @@ -609,7 +706,7 @@ begin neues:=false; for i:=_mglAbh.count-1 downto 0 do begin for j:=0 to length(_mglAbh[i].quellen)-1 do - findeMehrZiele(_mglAbh[i].ziele,_mglAbh[i].zieleFkt,_mglAbh[i].quellen[j].name,machDatei,_dats); + findeMehrZiele(_mglAbh[i].ziele,_mglAbh[i].zieleFkt,_mglAbh[i].quellen[j].name); if length(_mglAbh[i].ziele)=0 then begin // immer noch keine ziele gibAus('Warnung: Keine Ziele für diese Abhängigkeit!',3); gibAus('quellen:',3); @@ -860,99 +957,5 @@ begin end; end; -procedure sammleDateien(wo: string; rekursiv: boolean; ignoriere: array of tRegExpr; var dats: tDateienMitDaten); -var - sr: tSearchRec; - err,i: longint; - weglassen: boolean; -begin - err:=FindFirst(wo,fareadOnly or faHidden or faSysFile or (byte(rekursiv)*faDirectory),sr); - while err=0 do begin - weglassen:=false; - for i:=0 to length(ignoriere)-1 do - weglassen:=weglassen or ignoriere[i].exec(extractfilepath(wo)+sr.name); - if not weglassen then begin - if sr.attr and faDirectory <> 0 then begin - if rekursiv and - (sr.name<>'.') and - (sr.name<>'..') then - sammleDateien(extractfilepath(wo)+sr.name+'/*',rekursiv,ignoriere,dats); - end - else begin - setlength(dats,length(dats)+1); - dats[length(dats)-1]:=tDateiMitDatum.create; - dats[length(dats)-1].name:=extractfilepath(wo)+sr.name; - dats[length(dats)-1].aktuell:=aVeraltet; - end; - end; - err:=FindNext(sr); - end; - findClose(sr); -end; - -procedure zieleHinzufuegen(var ziele: tDateienMitDaten; ziel,quelle,inputfile: string; var dats: tDateienMitDaten); -var - i,ebene,ende: longint; - 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:=aNichtVorhanden; - 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: longint; -begin - for i:=0 to zieleFkt.count-1 do - zieleHinzufuegen(ziele,zieleFkt[i],quelle,inputfile,dats); -end; - end. |