[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.