From ebba3e8dcbd93ac9dc59cd1299e5907794f64ce4 Mon Sep 17 00:00:00 2001
From: Newbyte <newbyte@postmarketos.org>
Date: Mon, 21 Oct 2024 00:04:54 +0200
Subject: [PATCH] pmb.flasher: Remove use of args

Also adapt pmb/install/recovery.py to new API for variables.py.
---
 docs/api/pmb.commands.rst |  8 ++++
 pmb/commands/__init__.py  | 12 +++++-
 pmb/commands/flasher.py   | 83 +++++++++++++++++++++++++++++++++++++++
 pmb/flasher/__init__.py   |  1 -
 pmb/flasher/frontend.py   | 32 ---------------
 pmb/flasher/run.py        | 19 ++++++---
 pmb/flasher/variables.py  | 28 +++++++------
 pmb/helpers/frontend.py   |  4 --
 pmb/install/recovery.py   |  9 ++++-
 9 files changed, 140 insertions(+), 56 deletions(-)
 create mode 100644 pmb/commands/flasher.py

diff --git a/docs/api/pmb.commands.rst b/docs/api/pmb.commands.rst
index fd15a1d30..27fc44cb6 100644
--- a/docs/api/pmb.commands.rst
+++ b/docs/api/pmb.commands.rst
@@ -20,6 +20,14 @@ pmb.commands.base module
    :undoc-members:
    :show-inheritance:
 
+pmb.commands.flasher module
+---------------------------
+
+.. automodule:: pmb.commands.flasher
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
 pmb.commands.index module
 -------------------------
 
diff --git a/pmb/commands/__init__.py b/pmb/commands/__init__.py
index d0549e636..fe881d722 100644
--- a/pmb/commands/__init__.py
+++ b/pmb/commands/__init__.py
@@ -11,6 +11,7 @@ from pmb.helpers import frontend
 
 from .base import Command
 from .aportgen import Aportgen
+from .flasher import Flasher
 from .log import Log
 from .index import Index
 from .repo_bootstrap import RepoBootstrap
@@ -31,7 +32,6 @@ unmigrated_commands = [
     "export",
     "sideload",
     "netboot",
-    "flasher",
     "initfs",
     "qemu",
     "aportupgrade",
@@ -65,6 +65,16 @@ def run_command(args: PmbArgs):
     match args.action:
         case "aportgen":
             command = Aportgen(args.packages, args.fork_alpine, args.fork_alpine_retain_branch)
+        case "flasher":
+            command = Flasher(
+                args.action_flasher,
+                args.autoinstall,
+                getattr(args, "cmdline", None),
+                args.flash_method,
+                getattr(args, "no_reboot", None),
+                getattr(args, "partition", None),
+                getattr(args, "resume", None),
+            )
         case "log":
             command = Log(args.clear_log, args.lines)
         case "index":
diff --git a/pmb/commands/flasher.py b/pmb/commands/flasher.py
new file mode 100644
index 000000000..c6f873a0b
--- /dev/null
+++ b/pmb/commands/flasher.py
@@ -0,0 +1,83 @@
+# Copyright 2023 Oliver Smith
+# Copyright 2024 Stefan Hansson
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+import pmb.parse.deviceinfo
+from pmb import commands
+from pmb.core.context import get_context
+from pmb.flasher.frontend import flash_lk2nd, kernel, list_flavors, rootfs, sideload
+from pmb.helpers import logging
+
+
+class Flasher(commands.Command):
+    def __init__(
+        self,
+        action_flasher: str,
+        autoinstall: bool,
+        cmdline: str | None,
+        flash_method: str,
+        no_reboot: bool | None,
+        partition: str | None,
+        resume: bool | None,
+    ) -> None:
+        self.action_flasher = action_flasher
+        self.autoinstall = autoinstall
+        self.cmdline = cmdline
+        self.flash_method = flash_method
+        self.no_reboot = no_reboot
+        self.partition = partition
+        self.resume = resume
+
+    def run(self) -> None:
+        context = get_context()
+        action = self.action_flasher
+        device = context.config.device
+        deviceinfo = pmb.parse.deviceinfo()
+        method = self.flash_method or deviceinfo.flash_method
+
+        if method == "none" and action in ["boot", "flash_kernel", "flash_rootfs", "flash_lk2nd"]:
+            logging.info("This device doesn't support any flash method.")
+            return
+
+        if action in ["boot", "flash_kernel"]:
+            kernel(deviceinfo, method, action == "boot", self.autoinstall)
+        elif action == "flash_rootfs":
+            rootfs(deviceinfo, method)
+        elif action == "flash_vbmeta":
+            logging.info("(native) flash vbmeta.img with verity disabled flag")
+            pmb.flasher.run(
+                deviceinfo,
+                method,
+                "flash_vbmeta",
+                cmdline=self.cmdline,
+                no_reboot=self.no_reboot,
+                partition=self.partition,
+                resume=self.resume,
+            )
+        elif action == "flash_dtbo":
+            logging.info("(native) flash dtbo image")
+            pmb.flasher.run(
+                deviceinfo,
+                method,
+                "flash_dtbo",
+                cmdline=self.cmdline,
+                no_reboot=self.no_reboot,
+                partition=self.partition,
+                resume=self.resume,
+            )
+        elif action == "flash_lk2nd":
+            flash_lk2nd(deviceinfo, method)
+        elif action == "list_flavors":
+            list_flavors(device)
+        elif action == "list_devices":
+            pmb.flasher.run(
+                deviceinfo,
+                method,
+                "list_devices",
+                cmdline=self.cmdline,
+                no_reboot=self.no_reboot,
+                partition=self.partition,
+                resume=self.resume,
+            )
+        elif action == "sideload":
+            sideload(deviceinfo, method)
diff --git a/pmb/flasher/__init__.py b/pmb/flasher/__init__.py
index 2fd1c1fdc..6b163ce1f 100644
--- a/pmb/flasher/__init__.py
+++ b/pmb/flasher/__init__.py
@@ -5,4 +5,3 @@ from pmb.flasher.init import install_depends
 from pmb.flasher.run import run
 from pmb.flasher.run import check_partition_blacklist
 from pmb.flasher.variables import variables
-from pmb.flasher.frontend import frontend
diff --git a/pmb/flasher/frontend.py b/pmb/flasher/frontend.py
index 4b78014e6..75f38894c 100644
--- a/pmb/flasher/frontend.py
+++ b/pmb/flasher/frontend.py
@@ -7,7 +7,6 @@ from pmb.helpers import logging
 
 import pmb.config
 from pmb.parse.deviceinfo import Deviceinfo
-from pmb.types import PmbArgs
 import pmb.flasher
 import pmb.install
 import pmb.chroot.apk
@@ -146,34 +145,3 @@ def flash_lk2nd(deviceinfo: Deviceinfo, method: str) -> None:
 
     logging.info("(native) flash lk2nd image")
     pmb.flasher.run(deviceinfo, method, "flash_lk2nd")
-
-
-def frontend(args: PmbArgs) -> None:
-    context = get_context()
-    action = args.action_flasher
-    device = context.config.device
-    deviceinfo = pmb.parse.deviceinfo()
-    method = args.flash_method or deviceinfo.flash_method
-
-    if method == "none" and action in ["boot", "flash_kernel", "flash_rootfs", "flash_lk2nd"]:
-        logging.info("This device doesn't support any flash method.")
-        return
-
-    if action in ["boot", "flash_kernel"]:
-        kernel(deviceinfo, method, action == "boot", args.autoinstall)
-    elif action == "flash_rootfs":
-        rootfs(deviceinfo, method)
-    elif action == "flash_vbmeta":
-        logging.info("(native) flash vbmeta.img with verity disabled flag")
-        pmb.flasher.run(deviceinfo, method, "flash_vbmeta")
-    elif action == "flash_dtbo":
-        logging.info("(native) flash dtbo image")
-        pmb.flasher.run(deviceinfo, method, "flash_dtbo")
-    elif action == "flash_lk2nd":
-        flash_lk2nd(deviceinfo, method)
-    elif action == "list_flavors":
-        list_flavors(device)
-    elif action == "list_devices":
-        pmb.flasher.run(deviceinfo, method, "list_devices")
-    elif action == "sideload":
-        sideload(deviceinfo, method)
diff --git a/pmb/flasher/run.py b/pmb/flasher/run.py
index 46ba8cb8c..b8eaef0d4 100644
--- a/pmb/flasher/run.py
+++ b/pmb/flasher/run.py
@@ -24,7 +24,16 @@ def check_partition_blacklist(deviceinfo: Deviceinfo, key, value):
         )
 
 
-def run(deviceinfo: Deviceinfo, method: str, action: str, flavor=None):
+def run(
+    deviceinfo: Deviceinfo,
+    method: str,
+    action: str,
+    flavor: str | None = None,
+    cmdline: str | None = None,
+    no_reboot: bool | None = None,
+    partition: str | None = None,
+    resume: bool | None = None,
+) -> None:
     pmb.flasher.init(deviceinfo.codename, method)
 
     # Verify action
@@ -42,9 +51,7 @@ def run(deviceinfo: Deviceinfo, method: str, action: str, flavor=None):
         )
 
     # Variable setup
-    # FIXME: handle argparsing and pass in only the args we need.
-    args = pmb.helpers.args.please_i_really_need_args()
-    fvars = pmb.flasher.variables(args, flavor, method)
+    fvars = pmb.flasher.variables(flavor, method, cmdline, no_reboot, partition, resume)
 
     # vbmeta flasher requires vbmeta partition to be explicitly specified
     if action == "flash_vbmeta" and not fvars["$PARTITION_VBMETA"]:
@@ -69,12 +76,12 @@ def run(deviceinfo: Deviceinfo, method: str, action: str, flavor=None):
             "Deviceinfo_reference>"
         )
 
-    if args.no_reboot and ("flash" not in action or method != "heimdall-bootimg"):
+    if no_reboot and ("flash" not in action or method != "heimdall-bootimg"):
         raise RuntimeError(
             "The '--no-reboot' option is only" " supported when flashing with heimall-bootimg."
         )
 
-    if args.resume and ("flash" not in action or method != "heimdall-bootimg"):
+    if resume and ("flash" not in action or method != "heimdall-bootimg"):
         raise RuntimeError(
             "The '--resume' option is only" " supported when flashing with heimall-bootimg."
         )
diff --git a/pmb/flasher/variables.py b/pmb/flasher/variables.py
index 338032d09..b2f976e12 100644
--- a/pmb/flasher/variables.py
+++ b/pmb/flasher/variables.py
@@ -3,15 +3,21 @@
 import pmb.config.pmaports
 from pmb.core.chroot import Chroot
 from pmb.core.context import get_context
-from pmb.types import PmbArgs
 
 
-def variables(args: PmbArgs, flavor: str, method: str):
+def variables(
+    flavor: str | None,
+    method: str,
+    cmdline: str | None,
+    no_reboot: bool | None,
+    partition: str | None,
+    resume: bool | None,
+) -> dict[str, str]:
     device = get_context().config.device
     deviceinfo = pmb.parse.deviceinfo()
     _cmdline = deviceinfo.kernel_cmdline or ""
-    if "cmdline" in args and args.cmdline:
-        _cmdline = args.cmdline
+    if cmdline:
+        _cmdline = cmdline
 
     flash_pagesize = deviceinfo.flash_pagesize
 
@@ -54,22 +60,22 @@ def variables(args: PmbArgs, flavor: str, method: str):
         _partition_vbmeta = deviceinfo.flash_heimdall_partition_vbmeta or None
         _partition_dtbo = deviceinfo.flash_heimdall_partition_dtbo or None
 
-    if "partition" in args and args.partition:
+    if partition:
         # Only one operation is done at same time so it doesn't matter
         # sharing the arg
-        _partition_kernel = args.partition
-        _partition_rootfs = args.partition
-        _partition_vbmeta = args.partition
-        _partition_dtbo = args.partition
+        _partition_kernel = partition
+        _partition_rootfs = partition
+        _partition_vbmeta = partition
+        _partition_dtbo = partition
 
     _dtb = deviceinfo.dtb + ".dtb"
 
     _no_reboot = ""
-    if getattr(args, "no_reboot", False):
+    if no_reboot:
         _no_reboot = "--no-reboot"
 
     _resume = ""
-    if getattr(args, "resume", False):
+    if resume:
         _resume = "--resume"
 
     fvars = {
diff --git a/pmb/helpers/frontend.py b/pmb/helpers/frontend.py
index 69b62fcbe..aac0649eb 100644
--- a/pmb/helpers/frontend.py
+++ b/pmb/helpers/frontend.py
@@ -403,10 +403,6 @@ def install(args: PmbArgs) -> None:
     pmb.install.install(args)
 
 
-def flasher(args: PmbArgs) -> None:
-    pmb.flasher.frontend(args)
-
-
 def export(args: PmbArgs) -> None:
     pmb.export.frontend(args)
 
diff --git a/pmb/install/recovery.py b/pmb/install/recovery.py
index e08e13b24..fee2c7fb8 100644
--- a/pmb/install/recovery.py
+++ b/pmb/install/recovery.py
@@ -21,7 +21,14 @@ def create_zip(args: PmbArgs, chroot: Chroot, device: str):
     flavor = pmb.helpers.frontend._parse_flavor(device)
     deviceinfo = pmb.parse.deviceinfo()
     method = deviceinfo.flash_method
-    fvars = pmb.flasher.variables(args, flavor, method)
+    fvars = pmb.flasher.variables(
+        flavor,
+        method,
+        getattr(args, "cmdline", None),
+        getattr(args, "no_reboot", None),
+        getattr(args, "partition", None),
+        getattr(args, "resume", None),
+    )
 
     # Install recovery installer package in buildroot
     pmb.chroot.apk.install(["postmarketos-android-recovery-installer"], chroot)
-- 
GitLab