[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [tyndur-devel] [PATCH 1/9] lpt: Aktuellste und nicht erste Version installieren
On Sun, Dec 13, 2009 at 06:31:36PM +0100, Antoine Kaufmann wrote:
> * 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;
Hm, muss das wirklich public sein?
> +
> + (**
> + * 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;
Überflüssig?
> +
> + (* 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;
- darf also nur nach allen Punkten kommen?
> +
> + (* 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);
Vielleicht hier die Exception fangen falls einer Buchstaben reinmischt
und dann auch -1 zurückgeben?
> + 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
Gibt es irgendeinen Grund für repeat begin ... end until statt einfach
nur repeat ... until? ;-)
> + 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.
Sieht ansonsten glaubwürdig aus.