[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 1/9] lpt: Aktuellste und nicht erste Version installieren



* lpt: Aktuellste und nicht erste Version im Repo installieren

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/modules/pas/lpt/packages.pas |  115 +++++++++++++++++++++++++++++++++++++-
 1 files changed, 113 insertions(+), 2 deletions(-)

diff --git a/src/modules/pas/lpt/packages.pas b/src/modules/pas/lpt/packages.pas
index d5a0218..7cab104 100644
--- a/src/modules/pas/lpt/packages.pas
+++ b/src/modules/pas/lpt/packages.pas
@@ -60,6 +60,9 @@ type
 
             function add(number: String): TPackageVersion;
 
+            (** Neuste Version dieser Section suchen. *)
+            function getCurrentVersion(): TPackageVersion;
+
         public
             section:    String;
             versions:   TCollection;
@@ -76,6 +79,20 @@ type
             procedure addDependency(typ: char; dep: String);
             procedure copyDependencies(from: TPackageVersion);
 
+            (**
+             * n-ten Teil der Versionsnummer auslesen. Teile, die nicht gesetzt
+             * sind, werden einfach als -1 zurueckgegeben.
+             *)
+            function getVersionPart(n: Integer): Integer;
+
+            (**
+             * Diese Version mit der angegebenen vergleichen. Ist die angegebene
+             * neuer wird ein Wert kleiner 0 zurueckgegeben, ist sie aelter,
+             * wird ein Wert groesser 0 zurueckgegeben. Falls die beiden
+             * Versionen geleich sind, wird 0 zurueckgegeben.
+             **)
+            function compareTo(other: TPackageVersion): integer;
+
             property preinstDependencies: TCollection read instDep;
             property runDependencies: TCollection read runDep;
 
@@ -124,8 +141,7 @@ begin
         if pkg.name = pkgname then begin
             sect := pkg.section[sectname];
             if (sect <> nil) and (sect.versions.count > 0) then begin
-                // TODO Aktuellste Version nehmen
-                exit(TPackageVersion(sect.versions.items[0]));
+                exit(sect.getCurrentVersion);
             end;
         end;
     end;
@@ -293,6 +309,26 @@ begin
     exit(version);
 end;
 
+(** Neuste Version dieser Section suchen. *)
+function TPackageSection.getCurrentVersion(): TPackageVersion;
+var
+    cur, other: TPackageVersion;
+    curVer, i: Integer;
+begin
+    (* Mit erstbester Version anfangen und immer wenn wir eine neuere finden
+       die als Aktuelle hernehmen. *)
+    cur := TPackageVersion(versions.items[0]);
+    for i := 1 to versions.count - 1 do begin
+        other := TPackageVersion(versions.items[i]);
+        if cur.compareTo(other) < 0 then begin
+            cur := other;
+        end;
+    end;
+
+    Exit(cur);
+end;
+
+
 constructor TPackageVersion.create(parent: TCollection);
 begin
     inherited;
@@ -350,4 +386,79 @@ begin
     end;
 end;
 
+(**
+ * n-ten Teil der Versionsnummer auslesen. Teile, die nicht gesetzt
+ * sind, werden einfach als -1 zurueckgegeben.
+ *)
+function TPackageVersion.getVersionPart(n: Integer): Integer;
+var
+    part, ver: String;
+    i, dotpos, num: Integer;
+begin
+    ver := version;
+    dotpos := 1;
+
+    (* Wir spalten den String Stueck fuer Stueck bei . und - auf und fuellen
+       ihn in ein Array *)
+    for i := 1 to n do begin
+        dotpos := Pos('.', ver);
+        if dotpos <= 0 then begin
+            dotpos := Pos('-', ver);
+        end;
+
+        (* Kein . oder - mehr gefunden, wenn noch ein Stueck uebrig ist, nehmen
+         wir das noch, sonst sind wir fertig. *)
+        if (Length(ver) = 0) then begin
+            Exit(-1);
+        end else if dotpos <= 0 then begin
+            dotpos := Length(ver) + 1;
+        end;
+
+        part := Copy(ver, 1, dotpos - 1);
+        ver := Copy(ver, dotpos + 1, Length(ver));
+        num := StrToInt(part);
+    end;
+
+    Exit(num);
+end;
+
+(**
+ * Diese Version mit der angegebenen vergleichen. Ist die angegebene
+ * neuer wird ein Wert kleiner 0 zurueckgegeben, ist sie aelter,
+ * wird ein Wert groesser 0 zurueckgegeben. Falls die beiden
+ * Versionen geleich sind, wird 0 zurueckgegeben.
+ **)
+function TPackageVersion.compareTo(other: TPackageVersion): integer;
+var
+    partA, partB, n: Integer;
+    aInv, bInv: Boolean;
+begin
+    n := 1;
+    aInv := false;
+    bInv := false;
+    repeat begin
+        partA := getVersionPart(n);
+        partB := other.getVersionPart(n);
+
+        (* Wenn eine Versionsnummer kuerzer ist als die andere, hat eine -1 und
+           die andere noch eine vernuenftige Zahl. Ist diese Zufaelligerweise 0,
+           muss der Vergleich trotzdem passen, da 0.2 = 0.2.0 *)
+        if partA = -1 then begin
+            aInv := true;
+            partA := 0;
+        end;
+        if partB = -1 then begin
+            bInv := true;
+            partB := 0;
+        end;
+
+        if (partA - partB) <> 0 then begin
+            Exit(partA - partB);
+        end;
+
+        Inc(n);
+    end; until aInv and bInv;
+    Exit(0);
+end;
+
 end.
-- 
1.6.3.3