diff options
author | Erich Eckner <git@eckner.net> | 2016-05-10 13:46:01 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2016-05-10 13:46:01 +0200 |
commit | c6cf1bdf03034b6d78a2bf310226419f7a4566e9 (patch) | |
tree | f08a7b1abc6cdc33d6970ee3fae44cdf0f332c7f | |
parent | df238f2618220d9a310e9d25f28c68d3f3f41d32 (diff) | |
download | Make-c6cf1bdf03034b6d78a2bf310226419f7a4566e9.tar.xz |
Reihenfolge selbst ermitteln
-rw-r--r-- | Make.lps | 96 | ||||
-rw-r--r-- | dateibeziehungen.pas | 331 | ||||
-rw-r--r-- | tools.pas | 2 |
3 files changed, 287 insertions, 142 deletions
@@ -9,23 +9,22 @@ <IsPartOfProject Value="True"/> <TopLine Value="19"/> <CursorPos X="55" Y="47"/> - <UsageCount Value="64"/> + <UsageCount Value="69"/> <Loaded Value="True"/> </Unit0> <Unit1> <Filename Value="Machdatei.txt"/> <IsPartOfProject Value="True"/> - <UsageCount Value="64"/> + <UsageCount Value="69"/> <DefaultSyntaxHighlighter Value="None"/> </Unit1> <Unit2> <Filename Value="tools.pas"/> <IsPartOfProject Value="True"/> <EditorIndex Value="2"/> - <TopLine Value="68"/> - <CursorPos X="10" Y="37"/> + <CursorPos X="44" Y="11"/> <FoldState Value=" T3f065 pk9kR0D]9jIk5070"/> - <UsageCount Value="43"/> + <UsageCount Value="48"/> <Loaded Value="True"/> </Unit2> <Unit3> @@ -33,7 +32,7 @@ <IsPartOfProject Value="True"/> <EditorIndex Value="-1"/> <FoldState Value=" T3i7039 pj2jP0B716."/> - <UsageCount Value="40"/> + <UsageCount Value="45"/> </Unit3> <Unit4> <Filename Value="dateibeziehungen.pas"/> @@ -41,23 +40,23 @@ <UnitName Value="dateiBeziehungen"/> <IsVisibleTab Value="True"/> <EditorIndex Value="1"/> - <TopLine Value="490"/> - <CursorPos X="80" Y="515"/> - <FoldState Value=" T3id03A pifjR0721226 pjIt40S2v"/> - <UsageCount Value="32"/> + <TopLine Value="18"/> + <CursorPos X="61" Y="44"/> + <FoldState Value=" T3j5036 pj3jM0B8 picjO0A512]KenX0o1]94kF035]9FjW0S2@"/> + <UsageCount Value="37"/> <Loaded Value="True"/> </Unit4> <Unit5> <Filename Value="Machdatei"/> <CursorPos X="45" Y="17"/> - <UsageCount Value="10"/> + <UsageCount Value="9"/> <DefaultSyntaxHighlighter Value="None"/> </Unit5> <Unit6> <Filename Value="../Stabile/lowlevelunit.pas"/> <EditorIndex Value="-1"/> <CursorPos X="26" Y="23"/> - <UsageCount Value="9"/> + <UsageCount Value="8"/> </Unit6> <Unit7> <Filename Value="../units/lowlevelunit.pas"/> @@ -71,155 +70,154 @@ <EditorIndex Value="-1"/> <TopLine Value="140"/> <CursorPos X="10" Y="160"/> - <UsageCount Value="10"/> + <UsageCount Value="9"/> </Unit8> <Unit9> <Filename Value="/usr/lib/fpc/src/rtl/objpas/math.pp"/> <EditorIndex Value="-1"/> <TopLine Value="162"/> <CursorPos X="10" Y="167"/> - <UsageCount Value="10"/> + <UsageCount Value="9"/> </Unit9> <Unit10> <Filename Value="../units/matheunit.pas"/> <EditorIndex Value="-1"/> - <UsageCount Value="10"/> + <UsageCount Value="9"/> </Unit10> <Unit11> <Filename Value="/usr/lib/fpc/src/rtl/objpas/sysutils/finah.inc"/> <EditorIndex Value="-1"/> <TopLine Value="4"/> <CursorPos X="10" Y="23"/> - <UsageCount Value="10"/> + <UsageCount Value="9"/> </Unit11> <Unit12> <Filename Value="/usr/lib/fpc/src/rtl/objpas/classes/classesh.inc"/> <EditorIndex Value="-1"/> - <TopLine Value="210"/> - <CursorPos X="3" Y="218"/> + <TopLine Value="225"/> + <CursorPos X="15" Y="244"/> <UsageCount Value="10"/> </Unit12> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="451" Column="27" TopLine="431"/> + <Caret Line="300" Column="12" TopLine="259"/> </Position1> <Position2> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="453" Column="44" TopLine="433"/> + <Caret Line="230" TopLine="207"/> </Position2> <Position3> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="481" Column="58" TopLine="461"/> + <Caret Line="289" Column="20" TopLine="241"/> </Position3> <Position4> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="482" Column="36" TopLine="462"/> + <Caret Line="311" Column="24" TopLine="246"/> </Position4> <Position5> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="483" Column="45" TopLine="463"/> + <Caret Line="611" Column="38" TopLine="324"/> </Position5> <Position6> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="508" Column="27" TopLine="488"/> + <Caret Line="610" Column="51" TopLine="358"/> </Position6> <Position7> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="525" Column="30" TopLine="506"/> + <Caret Line="613" Column="54" TopLine="365"/> </Position7> <Position8> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="531" Column="27" TopLine="511"/> + <Caret Line="611" Column="53" TopLine="528"/> </Position8> <Position9> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="538" Column="29" TopLine="518"/> + <Caret Line="36" Column="13" TopLine="16"/> </Position9> <Position10> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="577" Column="18" TopLine="557"/> + <Caret Line="83" Column="63" TopLine="50"/> </Position10> <Position11> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="602" Column="24" TopLine="577"/> + <Caret Line="205" Column="11" TopLine="86"/> </Position11> <Position12> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="600" TopLine="574"/> + <Caret Line="234" Column="4" TopLine="101"/> </Position12> <Position13> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="27" Column="14" TopLine="7"/> + <Caret Line="235" TopLine="101"/> </Position13> <Position14> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="90" Column="15" TopLine="67"/> + <Caret Line="250" Column="2" TopLine="101"/> </Position14> <Position15> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="99" Column="15" TopLine="73"/> + <Caret Line="451" Column="22" TopLine="419"/> </Position15> <Position16> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="25" Column="25" TopLine="5"/> + <Caret Line="550" Column="54" TopLine="462"/> </Position16> <Position17> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="93" Column="38" TopLine="60"/> + <Caret Line="557" Column="44" TopLine="469"/> </Position17> <Position18> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="11"/> + <Caret Line="558" Column="47" TopLine="470"/> </Position18> <Position19> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="46" Column="35" TopLine="28"/> + <Caret Line="585" Column="48" TopLine="556"/> </Position19> <Position20> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="179" TopLine="109"/> </Position20> <Position21> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="134" TopLine="108"/> + <Caret Line="36" Column="13" TopLine="3"/> </Position21> <Position22> - <Filename Value="dateibeziehungen.pas"/> - <Caret Line="210" TopLine="155"/> + <Filename Value="tools.pas"/> + <Caret Line="11" Column="44"/> </Position22> <Position23> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="265" TopLine="245"/> + <Caret Line="88" Column="33"/> </Position23> <Position24> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="491" TopLine="460"/> + <Caret Line="513" Column="58" TopLine="478"/> </Position24> <Position25> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="407" Column="13" TopLine="387"/> + <Caret Line="883" Column="48" TopLine="752"/> </Position25> <Position26> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="412" Column="55" TopLine="407"/> + <Caret Line="915" Column="40" TopLine="882"/> </Position26> <Position27> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="481" TopLine="452"/> + <Caret Line="504" Column="40" TopLine="485"/> </Position27> <Position28> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="448" Column="86" TopLine="425"/> + <Caret Line="502" Column="39" TopLine="485"/> </Position28> <Position29> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="460" TopLine="450"/> + <Caret Line="627" Column="20" TopLine="523"/> </Position29> <Position30> <Filename Value="dateibeziehungen.pas"/> - <Caret Line="463" Column="12" TopLine="171"/> + <Caret Line="634" Column="32" TopLine="606"/> </Position30> </JumpHistory> </ProjectSession> diff --git a/dateibeziehungen.pas b/dateibeziehungen.pas index 14c1128..7900913 100644 --- a/dateibeziehungen.pas +++ b/dateibeziehungen.pas @@ -25,19 +25,28 @@ type procedure mrProper; function add(neu: tAbhaengigkeit): longint; function last: tAbhaengigkeit; + procedure sort; end; tAbhaengigkeit = class(tObject) - quellenRE: tRegExpr; + private + _erben,_eltern: tAbhaengigkeiten; + public + quellenRE: tRegExpr; zieleFkt, - befehle: tStringlist; + befehle: tStringlist; quellen, - ziele: tDateienMitDaten; - erben: tAbhaengigkeiten; - prioritaet: longint; + ziele: tDateienMitDaten; constructor create; overload; constructor create(original: tAbhaengigkeit); overload; destructor destroy; override; + function hatQuelleVonAlsZiel(abh: tAbhaengigkeit): boolean; + function hatErbenMitQuelle(name: string): boolean; + function erbeMitGleichenZielen(zl: tDateienMitDaten): tAbhaengigkeit; + procedure neuerErbe(erb: tAbhaengigkeit); + procedure entferneErben(i: longint); overload; + procedure entferneErben(erb: tAbhaengigkeit); overload; + procedure entferneElterReferenz(elt: tAbhaengigkeit); end; tMach = class @@ -76,7 +85,7 @@ procedure findeMehrZiele(var ziele: tDateienMitDaten; zieleFkt: tStringList; que implementation uses - lowlevelunit, mystringlistunit, math; + lowlevelunit, mystringlistunit; // tAbhaengigkeiten ************************************************************ @@ -109,7 +118,12 @@ begin end; function tAbhaengigkeiten.add(neu: tAbhaengigkeit): longint; +var + i: longint; begin + for i:=0 to count-1 do + if items[i]=neu then + fehler('Fehler: Ich soll etwas zur Liste hinzufügen, was schon drin ist!'); result:=inherited add(neu); end; @@ -118,6 +132,69 @@ begin result:=tAbhaengigkeit(inherited last); end; +procedure tAbhaengigkeiten.sort; +var + i,j,k,pLen: longint; + perm: array of longint; + tmp: tAbhaengigkeit; + bedingungen: array of tPoint; + nehmbare: array of byte; // 0 = ja, 1 = nein, 2 = nie wieder (schon genommen) + fortschritt: boolean; +begin + // Permutation initialisieren + setlength(perm,count); + for i:=0 to length(perm)-1 do + perm[i]:=count; // sollte ohnehin überschrieben werden, aber "count" sorgt unten für einen Fehler! + + setlength(bedingungen,0); // aka "y hängt (direkt) von x ab" + for i:=0 to count-1 do + for j:=0 to count-1 do + if (i<>j) and (items[i].hatQuelleVonAlsZiel(items[j])) then begin + setlength(bedingungen,length(bedingungen)+1); + bedingungen[length(bedingungen)-1].x:=i; + bedingungen[length(bedingungen)-1].y:=j; + end; + + setlength(nehmbare,count); + for i:=0 to length(nehmbare)-1 do + nehmbare[i]:=0; + + pLen:=0; + while pLen<count do begin + fortschritt:=false; + for i:=0 to length(nehmbare)-1 do + if nehmbare[i]=1 then // noch nicht genommenes zurücksetzen + nehmbare[i]:=0; + for i:=0 to length(bedingungen)-1 do + if nehmbare[bedingungen[i].x]<2 then // wenn die Quelle noch nicht dran war, + nehmbare[bedingungen[i].y]:=1; // darf das Ziel auch nicht genommen werden + for i:=0 to length(nehmbare)-1 do + if nehmbare[i]=0 then begin // nehmbar? + nehmbare[i]:=2; // als "genommen" markieren + perm[pLen]:=i; + inc(pLen); + fortschritt:=true; + end; + if not fortschritt then + fehler('Ich kann keine Regel mehr finden, deren Quellen nicht mehr erzeugt werden müssen - gibt es vllt. eine zyklische Abhängigkeit?'); + end; + + // berechnete Permutation anwenden + for i:=0 to length(perm)-1 do + if perm[i]>=0 then begin + tmp:=items[i]; + j:=i; + while perm[j]<>i do begin + k:=perm[j]; + perm[j]:=-1; + items[j]:=items[k]; + j:=k; + end; + items[j]:=tmp; + perm[j]:=-1; + end; +end; + // tAbhaengigkeit ************************************************************** constructor tAbhaengigkeit.create; @@ -129,8 +206,8 @@ begin setlength(quellen,0); setlength(ziele,0); befehle:=tStringlist.create; - erben:=tAbhaengigkeiten.create; - prioritaet:=42; + _erben:=tAbhaengigkeiten.create; + _eltern:=tAbhaengigkeiten.create; end; constructor tAbhaengigkeit.create(original: tAbhaengigkeit); @@ -150,9 +227,9 @@ begin ziele[i]:=original.ziele[i]; befehle:=tStringlist.create; befehle.text:=original.befehle.text; - erben:=tAbhaengigkeiten.create; - erben.kopiereVon(original.erben); - prioritaet:=original.prioritaet; + _erben:=tAbhaengigkeiten.create; + _eltern:=tAbhaengigkeiten.create; + original.neuerErbe(self); end; destructor tAbhaengigkeit.destroy; @@ -162,10 +239,86 @@ begin setLength(ziele,0); zieleFkt.free; befehle.free; - erben.free; + while _erben.count>0 do + entferneErben(0); + while _eltern.count>0 do + _eltern[0].entferneErben(self); + _erben.free; + _eltern.free; inherited destroy; end; +function tAbhaengigkeit.hatQuelleVonAlsZiel(abh: tAbhaengigkeit): boolean; +var + i,j: longint; +begin + result:=true; + for i:=0 to length(ziele)-1 do + for j:=0 to length(abh.quellen)-1 do + if abh.quellen[j].name = ziele[i].name then + exit; + result:=false; +end; + +function tAbhaengigkeit.hatErbenMitQuelle(name: string): boolean; +var + i,j: longint; +begin + result:=true; + for i:=0 to _erben.count-1 do + for j:=0 to length(_erben[i].quellen)-1 do + if _erben[i].quellen[j].name=name then exit; + result:=false; +end; + +function tAbhaengigkeit.erbeMitGleichenZielen(zl: tDateienMitDaten): tAbhaengigkeit; +var + i: longint; +begin + result:=nil; + for i:=0 to _erben.count-1 do + if gleicheDateinamen(_erben[i].ziele,zl) then begin + result:=_erben[i]; + exit; + end; +end; + +procedure tAbhaengigkeit.neuerErbe(erb: tAbhaengigkeit); +begin + _erben.add(erb); + erb._eltern.add(self); +end; + +procedure tAbhaengigkeit.entferneErben(i: longint); +begin + _erben[i].entferneElterReferenz(self); + _erben.delete(i); +end; + +procedure tAbhaengigkeit.entferneErben(erb: tAbhaengigkeit); +var + i: longint; +begin + for i:=0 to _erben.count-1 do + if _erben[i]=erb then begin + entferneErben(i); + exit; + end; + fehler('Fehler: Kann Erben nicht finden zum Entfernen!'); +end; + +procedure tAbhaengigkeit.entferneElterReferenz(elt: tAbhaengigkeit); +var + i: longint; +begin + for i:=0 to _eltern.count-1 do + if _eltern[i]=elt then begin + _eltern.delete(i); + exit; + end; + fehler('Fehler: Kann Elter nicht finden zum Entfernen der Referenz!'); +end; + // tMach *********************************************************************** constructor tMach.create; @@ -216,7 +369,7 @@ var na: tAbhaengigkeit; ignoriere: array of tRegExpr; rek: boolean; - num,posi: longint; + posi: longint; wasWar,wasIst: tZeilenTyp; procedure aufraeumen; @@ -234,9 +387,7 @@ begin result:=false; na:=tAbhaengigkeit.create; - na.prioritaet:=0; setlength(ignoriere,0); - num:=0; wasWar:=ztSuche; f:=tMyStringList.create; f.loadFromFile(machDatei); @@ -261,9 +412,7 @@ begin if (wasWar=ztBefehl) and (wasIst<>ztBefehl) then begin _oriAbh.add(na); - inc(num); na:=tAbhaengigkeit.create; - na.prioritaet:=num; end; if s='%%DATEIENDE%%' then break; @@ -361,7 +510,7 @@ begin 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; + _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]+'''!'); @@ -378,31 +527,25 @@ end; procedure tMach.erzeugeRegeln; var - i,j,k,l: longint; - neues,schonDa: boolean; - s: string; - tmpZiele: tDateienMitDaten; + i,j,k,l: longint; + neues: boolean; + s: string; + tmpZiele: tDateienMitDaten; + erb: tAbhaengigkeit; begin - repeat neues:=false; for i:=0 to _oriAbh.count-1 do for j:=0 to length(_dats)-1 do if _oriAbh[i].quellenRE.exec(_dats[j].name) then begin - schonDa:=false; - for k:=0 to _oriAbh[i].erben.count-1 do - for l:=0 to length(_oriAbh[i].erben[k].quellen)-1 do - schonDa:=schonDa or (_oriAbh[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; + if _oriAbh[i].hatErbenMitQuelle(_dats[j].name) 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,_oriAbh[i].zieleFkt,_dats[j].name,machDatei,_dats); @@ -416,32 +559,31 @@ begin fehler('... ich beende.'); end; - for k:=0 to _oriAbh[i].erben.count-1 do - if gleicheDateinamen(_oriAbh[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(_oriAbh[i].erben[k].quellen,length(_oriAbh[i].erben[k].quellen)+1); - _oriAbh[i].erben[k].quellen[length(_oriAbh[i].erben[k].quellen)-1]:=_dats[j]; - // und womöglich die befehle generiert - for l:=0 to _oriAbh[i].befehle.count-1 do begin - s:=_oriAbh[i].befehle[l]; - if quellersetzung(s,_dats[j].name,machDatei) then begin - if l=0 then _oriAbh[i].erben[k].befehle.clear; - _oriAbh[i].erben[k].befehle.add(s); - end; + erb:=_oriAbh[i].erbeMitGleichenZielen(tmpZiele); + if assigned(erb) then begin + // es gibt schon eine Regel für die Ziele der Quelle, + // dann wird dieser Regel nur die Quelle hinzugefügt + setlength(erb.quellen,length(erb.quellen)+1); + erb.quellen[length(erb.quellen)-1]:=_dats[j]; + // und womöglich die befehle generiert + for l:=0 to _oriAbh[i].befehle.count-1 do begin + s:=_oriAbh[i].befehle[l]; + if quellersetzung(s,_dats[j].name,machDatei) then begin + if l=0 then erb.befehle.clear; + erb.befehle.add(s); end; - neues:=true; - break; // mehr Ziele sollte es ohnehin nicht geben end; - if schonDa then continue; + neues:=true; + continue; + end; // Ziel(e) ist/sind neu _mglAbh.add(tAbhaengigkeit.create); - _oriAbh[i].erben.add(_mglAbh.last); + _oriAbh[i].neuerErbe(_mglAbh.last); setlength(_mglAbh.last.quellen,1); _mglAbh.last.quellen[0]:=_dats[j]; - _mglAbh.last.zieleFkt:=_oriAbh[i].zieleFkt; + _mglAbh.last.zieleFkt:=tStringlist.create; + _mglAbh.last.zieleFkt.text:=_oriAbh[i].zieleFkt.text; setlength(_mglAbh.last.ziele,length(tmpZiele)); for k:=0 to length(tmpZiele)-1 do _mglAbh.last.ziele[k]:=tmpZiele[k]; @@ -451,7 +593,6 @@ begin if quellersetzung(s,_dats[j].name,machDatei) then _mglAbh.last.befehle.add(s); end; - _mglAbh.last.prioritaet:=_oriAbh[i].prioritaet; end; until not neues; @@ -461,44 +602,57 @@ procedure tMach.findeWasZuTunIst; var i,j,k: longint; ziA,quA: tAktualitaet; + neues: boolean; begin // schauen, welche Regeln angewandt werden müssen + repeat + 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); + 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); + for k:=0 to length(_mglAbh[i].quellen)-1 do + gibAus(' '''+_mglAbh[i].quellen[k].name+'''',3); + gibAus('zieleFkt:',3); + for k:=0 to _mglAbh[i].zieleFkt.count-1 do + gibAus(' '''+_mglAbh[i].zieleFkt[k]+'''',3); + gibAus(' - wird ignoriert.',3); + _mglAbh[i].free; + _mglAbh.delete(i); + continue; + end; - for i:=0 to _mglAbh.count-1 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); - 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); - for k:=0 to length(_mglAbh[i].quellen)-1 do - gibAus(' '''+_mglAbh[i].quellen[k].name+'''',3); - gibAus('zieleFkt:',3); - for k:=0 to _mglAbh[i].zieleFkt.count-1 do - gibAus(' '''+_mglAbh[i].zieleFkt[k]+'''',3); - gibAus(' - wird ignoriert.',3); - continue; - end; - - quA:=aAktuell; - for j:=0 to length(_mglAbh[i].quellen)-1 do - if _mglAbh[i].quellen[j].aktuell<>aAktuell then - quA:=aWirdErneuert; - ziA:=aWirdErneuert; - for j:=0 to length(_mglAbh[i].ziele)-1 do - ziA:=min(ziA,_mglAbh[i].ziele[j].aktuell); - - if ziA<quA then begin - _ztAbh.add(tAbhaengigkeit.create(_mglAbh[i])); - _mglAbh[i].erben.add(_ztAbh.last); + quA:=aAktuell; + for j:=0 to length(_mglAbh[i].quellen)-1 do + if _mglAbh[i].quellen[j].aktuell<>aAktuell then + quA:=aWirdErneuert; + ziA:=aWirdErneuert; for j:=0 to length(_mglAbh[i].ziele)-1 do - _mglAbh[i].ziele[j].aktuell:=aWirdErneuert; + if _mglAbh[i].ziele[j].aktuell=aVeraltet then + ziA:=min(ziA,aAktuell) + else + ziA:=min(ziA,_mglAbh[i].ziele[j].aktuell); + + if ziA<quA then begin + neues:=true; + _ztAbh.add(tAbhaengigkeit.create(_mglAbh[i])); + for j:=0 to length(_mglAbh[i].ziele)-1 do + _mglAbh[i].ziele[j].aktuell:=aWirdErneuert; + _mglAbh[i].free; + _mglAbh.delete(i); + end; end; - end; + until not neues; + + // anzuwendende Regeln sortieren + _ztAbh.sort; end; procedure tMach.tueWasZuTunIst(allesNeu, unsicher: boolean; ausgabeDatei: string); var - prior,i,j: longint; + i,j: longint; ausg: textfile; befehle,geaenderteDateien, sumDateien: tStringlist; @@ -507,9 +661,6 @@ var befehl: string; begin befehle:=tStringlist.create; - prior:=0; - for i:=0 to _ztAbh.count-1 do - prior:=max(prior,_ztAbh[i].prioritaet); geaenderteDateien:=tStringlist.create; sumDateien:=dateienMitGueltigerSumme(pruefsummenDatei); for i:=0 to length(_dats)-1 do begin @@ -537,13 +688,9 @@ begin for j:=0 to length(_ztAbh[i].quellen)-1 do geaenderteDateien.add(_ztAbh[i].quellen[j].name); end; - while prior>=0 do begin - for i:=0 to _ztAbh.count-1 do - if _ztAbh[i].prioritaet=prior then - for j:=0 to _ztAbh[i].befehle.count-1 do - befehle.add(_ztAbh[i].befehle[j]); - dec(prior); - end; + for i:=0 to _ztAbh.count-1 do + for j:=0 to _ztAbh[i].befehle.count-1 do + befehle.add(_ztAbh[i].befehle[j]); if not unsicher then begin lokTest:=tRegExpr.create; if extractfilepath(ausgabeDatei)=extractfilepath(pruefsummenDatei) then @@ -566,14 +713,14 @@ begin end; end; if geaenderteDateien.count>0 then begin - befehle.add('echo -ne "Sha512summen erneuern ..."'); + befehle.add('echo -n "Sha512summen erneuern ..."'); befehl:='sed "'; for i:=0 to geaenderteDateien.count-1 do befehl:=befehl+'/\s'+escape(geaenderteDateien[i],'./','\')+'\$/d; '; befehl:=befehl+'" -i "'+pruefsummenDatei+'"'; befehle.add(befehl); for i:=0 to geaenderteDateien.count-1 do - befehle.add('/usr/bin/sha512sum "'+geaenderteDateien[i]+'" >> '+pruefsummenDatei); + befehle.add('sha512sum "'+geaenderteDateien[i]+'" >> '+pruefsummenDatei); befehle.add('echo " fertig"'); end; @@ -767,7 +914,7 @@ begin 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 + dats[i].aktuell:=aNichtVorhanden; setlength(ziele,length(ziele)+1); ziele[length(ziele)-1]:=dats[i]; end; @@ -8,7 +8,7 @@ uses classes, sysUtils, process, mystringlistunit, regExpr; type - tAktualitaet = (aVeraltet,aAktuell,aWirdErneuert); + tAktualitaet = (aNichtVorhanden,aVeraltet,aAktuell,aWirdErneuert); tStringlistBArray = array[boolean] of tStringlist; tSummenDatei = record name: string; |