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

[tyndur-devel] [PATCH 8/9] lpt: Alle Pakete Updaten (lpt upgrade-all)



+ lpt: Alle Pakete Updaten (lpt upgrade-all)

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/modules/pas/lpt/lang/lang_en.c |   15 ++++++-
 src/modules/pas/lpt/lang/resstr.h  |    3 +
 src/modules/pas/lpt/lpt.pas        |   90 +++++++++++++++++++++++++++++++++++-
 3 files changed, 105 insertions(+), 3 deletions(-)

diff --git a/src/modules/pas/lpt/lang/lang_en.c b/src/modules/pas/lpt/lang/lang_en.c
index dd3b228..3c45acf 100644
--- a/src/modules/pas/lpt/lang/lang_en.c
+++ b/src/modules/pas/lpt/lang/lang_en.c
@@ -63,7 +63,8 @@ static const struct tms_strings dict[] = {
     "  get:     Install a package\n"
     "  install: Install a package from a local file\n"
     "           (speficy file name as last parameter)\n"
-    "  remove:  Remove a package",
+    "  remove:  Remove a package\n"
+    "  upgrade-all: Upgrade all installed packages",
 
     // Herunterladen und Entpacken von %s
     &RESSTR_P$LPT_RSDOWNLOADANDEXTRACT,
@@ -81,6 +82,14 @@ static const struct tms_strings dict[] = {
     &RESSTR_P$LPT_RSREMOVING,
     "Removing %s",
 
+    // Folgende Pakete werden aktualisiert:
+    &RESSTR_P$LPT_RSPACKAGESTOUPGRADE,
+    "The following packages will be upgraded:",
+
+    // Aenderungen uebernehmen? (j/N)
+    &RESSTR_P$LPT_RSAPPLYCHANGESYESNO,
+    "Apply changes? (y/N)",
+
     // Fehler:
     &RESSTR_P$LPT_RSERROR,
     "Error:",
@@ -125,6 +134,10 @@ static const struct tms_strings dict[] = {
     &RESSTR_P$LPT_RSNOPKGCONTENTFILE,
     "Could not remove package, pkgcontent file is missing.",
 
+    // Keine Aktualisierungen verfuegbar
+    &RESSTR_P$LPT_RSNOUPDATESAVAILABLE,
+    "No updates available",
+
     // Paket %s fehlt
     &RESSTR_PACKAGES_RSPACKAGEMISSING,
     "Package %s is not available",
diff --git a/src/modules/pas/lpt/lang/resstr.h b/src/modules/pas/lpt/lang/resstr.h
index 10f95e7..296a381 100644
--- a/src/modules/pas/lpt/lang/resstr.h
+++ b/src/modules/pas/lpt/lang/resstr.h
@@ -39,6 +39,8 @@ extern void* RESSTR_P$LPT_RSDOWNLOADANDEXTRACT;
 extern void* RESSTR_P$LPT_RSSEARCHING;
 extern void* RESSTR_P$LPT_RSCONFIGURING;
 extern void* RESSTR_P$LPT_RSREMOVING;
+extern void* RESSTR_P$LPT_RSPACKAGESTOUPGRADE;
+extern void* RESSTR_P$LPT_RSAPPLYCHANGESYESNO;
 extern void* RESSTR_P$LPT_RSERROR;
 extern void* RESSTR_P$LPT_RSCANTLOADREPOLIST;
 extern void* RESSTR_P$LPT_RSFAILDOWNLOADREPOLIST;
@@ -50,6 +52,7 @@ extern void* RESSTR_P$LPT_RSCANNOTRESOLVEDEP;
 extern void* RESSTR_P$LPT_RSWRONGPARAMCOUNT;
 extern void* RESSTR_P$LPT_RSINVALIDACTION;
 extern void* RESSTR_P$LPT_RSNOPKGCONTENTFILE;
+extern void* RESSTR_P$LPT_RSNOUPDATESAVAILABLE;
 extern void* RESSTR_PACKAGES_RSPACKAGEMISSING;
 extern void* RESSTR_REPOSITORIES_RSUNKNOWNREPOTYPE;
 extern void* RESSTR_REPOSITORIES_RSINVALIDPKGSRC;
diff --git a/src/modules/pas/lpt/lpt.pas b/src/modules/pas/lpt/lpt.pas
index cef2d56..97da589 100644
--- a/src/modules/pas/lpt/lpt.pas
+++ b/src/modules/pas/lpt/lpt.pas
@@ -13,13 +13,15 @@ resourcestring
         '  get:  Installiert das angegebene Paket'#10 +
         '  install: Installiert das angegebene Paket aus lokaler Datei'#10 +
         '           Achtung, Datei als letzten Parameter angeben!'#10 +
-        '  remove: Paket deinstallieren';
-
+        '  remove: Paket deinstallieren'#10 +
+        '  upgrade-all: Alle installierten Pakete aktualisieren';
 
     rsDownloadAndExtract = 'Herunterladen und Entpacken von %s';
     rsSearching = 'Suche %s';
     rsConfiguring = 'Richte %s ein';
     rsRemoving = 'Entferne %s';
+    rsPackagesToUpgrade = 'Folgende Pakete werden aktualisiert:';
+    rsApplyChangesYesNo = '�nderungen übernehmen? (j/N)';
 
     rsError = 'Fehler:';
     rsCantLoadRepoList = 'Kann Repository-Liste nicht laden:';
@@ -33,6 +35,7 @@ resourcestring
     rsInvalidAction = 'Ungütige Aktion:';
     rsNoPkgcontentFile = 'Kann Paket nicht deinstallieren, da die pkgcontent-' +
         'Datei fehlt.';
+    rsNoUpdatesAvailable = 'Keine Aktualisierungen verfügbar';
 
 
 procedure PrintUsage;
@@ -454,6 +457,82 @@ begin
     RemoveVersion(version);
 end;
 
+(**
+ * Alle installierten Pakete aktualisieren
+ *)
+procedure UpgradeAll;
+var
+    pkgset, installed, toInstall, toRemove: TPackageSet;
+    pkg: TPackage;
+    sect: TPackageSection;
+    verInst, verRepo: TPackageVersion;
+
+    i, j: Integer;
+    answer: Char;
+begin
+    pkgset := TPackageSet.create;
+    installed := TPackageSet.create;
+    toInstall := TPackageSet.create;
+    toRemove := TPackageSet.create;
+
+    FindInstalledPackages(installed);
+    ReadPkgsrc(getConfigRoot + 'pkgsrc');
+    ReadPkglists(pkgset);
+
+
+    (* Pakete zum Aktualisieren finden *)
+    WriteLn(rsPackagesToUpgrade);
+    for i := 0 to installed.packages.count - 1 do begin
+        pkg := TPackage(installed.packages.items[i]);
+        for j := 0 to pkg.sections.count - 1 do begin
+            sect := TPackageSection(pkg.sections.items[j]);
+            verInst := installed.GetCurrentVersion(pkg.name, sect.section);
+            verRepo := pkgset.GetCurrentVersion(pkg.name, sect.section);
+
+            (* Das Paket ist nicht im Repo oder nicht installiert *)
+            if (verInst = nil) or (verRepo = nil) then begin
+                continue;
+            end;
+
+            (* Wenn die Version im Repo neuer ist als unsere Lokale koennen wir
+               updaten *)
+            if verInst.compareTo(verRepo) < 0 then begin
+                WriteLn('   ' + pkg.name + ': ' + verInst.version + '=>' +
+                    verRepo.version);
+                toInstall.addVersion(verRepo);
+                toRemove.addVersion(verInst);
+            end;
+        end;
+    end;
+
+    if toInstall.packages.count < 1 then begin
+        WriteLn('   ', rsNoUpdatesAvailable);
+        Exit;
+    end;
+
+    WriteLn(rsApplyChangesYesNo);
+    Read(answer);
+    if  (answer <> 'j') and (answer <> 'J') and (answer <> 'y') and
+        (answer <> 'Y') then
+    begin
+        Exit;
+    end;
+
+    (* Alte Versionen deinstallieren *)
+    for i := 0 to toRemove.packages.count - 1 do begin
+        pkg := TPackage(toRemove.packages.items[i]);
+        sect := TPackageSection(pkg.sections.items[0]);
+        verInst := TPackageVersion(sect.versions.items[0]);
+        RemoveVersion(verInst);
+    end;
+
+    (* Neue Versionen installieren *)
+    for i := 0 to toInstall.packages.count - 1 do begin
+        pkg := TPackage(toInstall.packages.items[i]);
+        Get(pkg.name, false);
+    end;
+end;
+
 function c_lostio_create_link(target, link: PChar; hard: boolean): integer; cdecl; external name 'io_create_link';
 
 procedure CfgAddbin(path, pubname: String);
@@ -553,6 +632,13 @@ begin
             WriteLn(rsWrongParamCount);
             PrintUsage;
         end;
+    end else if system.ParamStr(1) = 'upgrade-all' then begin
+        if system.ParamCount = 1 then begin
+            UpgradeAll;
+        end else begin
+            WriteLn('Falsche Parameterzahl');
+            PrintUsage;
+        end;
     end else if system.ParamStr(1) = 'cfg-addbin' then begin
         if system.ParamCount = 3 then begin
             CfgAddbin(system.ParamStr(2), system.ParamStr(3));
-- 
1.6.3.3