From ecdf09c63bf81ff723536687d6d6c4bdf8c7cf50 Mon Sep 17 00:00:00 2001 From: Nixietab <75538775+nixietab@users.noreply.github.com> Date: Thu, 10 Sep 2026 16:02:57 -0300 Subject: [PATCH] Added normal up functionality --- main.go | 16 ++++++++++++---- zypper.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index c9f2946..9c7279d 100644 --- a/main.go +++ b/main.go @@ -33,7 +33,7 @@ type config struct { txInfo []packageInfo // parsed packages from dry-run } -// CLI +// CLI func printHelp() { // Ensure cfg is available for colorStart @@ -52,7 +52,7 @@ func printHelp() { } usage := fmt.Sprintf(`%susage%s: vlcro [-h] [-v] [-y] [-j N] [--debug] [--no-color] -%s {refresh,ref,dist-upgrade,dup,install,in,install-new-recommends,inr} ... +%s {refresh,ref,dist-upgrade,dup,update,up,install,in,install-new-recommends,inr} ... %s%s%s (%sv%s%s) makes zypper faster by running slow operations in parallel. @@ -71,6 +71,9 @@ func printHelp() { %sdist-upgrade%s (%sdup%s) perform distribution upgrade %s-d, --download-only%s download packages without installing + %supdate%s (%sup%s) update all installed packages + %s-d, --download-only%s download packages without installing + %sinstall%s (%sin%s) install one or more packages %s-d, --download-only%s download packages without installing %s%s package name(s) to install @@ -86,6 +89,7 @@ func printHelp() { hi, d, hd, d, hd, d, he, d, hd, d, hd, d, he, d, + hd, d, hd, d, he, d, hd, d, hd, d, he, d, hd, d, hd, d, hd, d, he, d) @@ -123,8 +127,8 @@ func isInstallCommand(cmd string) bool { func isKnownCommand(cmd string) bool { switch cmd { - case "refresh", "ref", "dist-upgrade", "dup", "install", "in", - "install-new-recommends", "inr": + case "refresh", "ref", "dist-upgrade", "dup", "update", "up", + "install", "in", "install-new-recommends", "inr": return true } return false @@ -340,6 +344,10 @@ func main() { if err := handleDistUpgrade(ctx, tmpDir); err != nil { exitCode = 1 } + case "update", "up": + if err := handleUpdate(ctx, tmpDir); err != nil { + exitCode = 1 + } case "install", "in": if err := handleInstall(ctx, tmpDir); err != nil { exitCode = 1 diff --git a/zypper.go b/zypper.go index 36ff478..3cbbaaf 100644 --- a/zypper.go +++ b/zypper.go @@ -742,6 +742,59 @@ func handleDistUpgrade(ctx context.Context, tmpDir string) error { return nil } +func handleUpdate(ctx context.Context, tmpDir string) error { + tracker := &MountTracker{} + defer vlcroCleanup(tmpDir, tracker) + + statusMsg("Reading package lists") + statusMsg("Building dependency tree") + info, err := dryRunAndParse([]string{"update", "--dry-run"}) + if err != nil { + errorf("%s", colorText(colorError, fmt.Sprintf("Error: %v", err))) + return err + } + + if info.nothingToDo { + infof("%s", colorText(colorInfo, "Nothing to do. Exiting...")) + return nil + } + + cfg.txInfo = info.installs + + if !showTransactionAndConfirm(info) { + return nil + } + + getZyppLock() + + if info.downloadSize > 0 { + statusMsg("Downloading packages") + err := mainTask(ctx, pkgNames(info.installs), tmpDir, false, tracker) + if err == context.Canceled { + return err + } + if err != nil { + warningf("%s", colorText(colorWarning, fmt.Sprintf("Parallel execution failed (%v). Falling back to standard zypper...", err))) + } + } + + vlcroCleanup(tmpDir, tracker) + + if !cfg.downloadOnly { + infof("%s", colorText(colorInfo, "Vlcro has finished its tasks. Handing you over to zypper...")) + nonInteractive := "" + if cfg.noConfirm { + nonInteractive = "--non-interactive" + } + code := handover(fmt.Sprintf("env ZYPP_CURL2=1 ZYPP_PCK_PRELOAD=1 ZYPP_SINGLE_RPMTRANS=1 zypper %s --no-cd update", nonInteractive)) + if code != 0 { + return fmt.Errorf("zypper update failed with exit code %d", code) + } + } + + return nil +} + func handleInstall(ctx context.Context, tmpDir string) error { if len(cfg.packages) == 0 { errorf("%s", colorText(colorError, "No packages specified for installation"))