From 7a3f3a89051b523249a16b4ec87a6eb3c4c4b989 Mon Sep 17 00:00:00 2001 From: SteveLauC Date: Fri, 16 Feb 2024 11:57:53 +0800 Subject: [PATCH] feat: support waydroid (#687) --- src/config.rs | 1 + src/main.rs | 1 + src/steps/os/linux.rs | 47 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/config.rs b/src/config.rs index 3b01e0e7..259d5a91 100644 --- a/src/config.rs +++ b/src/config.rs @@ -147,6 +147,7 @@ pub enum Step { Vcpkg, Vim, Vscode, + Waydroid, Winget, Wsl, WslUpdate, diff --git a/src/main.rs b/src/main.rs index 9eb2337c..b00cd792 100644 --- a/src/main.rs +++ b/src/main.rs @@ -235,6 +235,7 @@ fn run() -> Result<()> { unix::run_brew_formula(&ctx, unix::BrewVariant::Path) })?; runner.execute(Step::Lure, "LURE", || linux::run_lure_update(&ctx))?; + runner.execute(Step::Waydroid, "Waydroid", || linux::run_waydroid(&ctx))?; } #[cfg(target_os = "macos")] diff --git a/src/steps/os/linux.rs b/src/steps/os/linux.rs index c9ff4801..6e8b2bd8 100644 --- a/src/steps/os/linux.rs +++ b/src/steps/os/linux.rs @@ -10,7 +10,7 @@ use crate::error::{SkipStep, TopgradeError}; use crate::execution_context::ExecutionContext; use crate::steps::generic::is_wsl; use crate::steps::os::archlinux; -use crate::terminal::print_separator; +use crate::terminal::{print_separator, prompt_yesno}; use crate::utils::{require, require_option, which, PathExt, REQUIRE_SUDO}; use crate::{Step, HOME_DIR}; @@ -1020,6 +1020,51 @@ pub fn run_lure_update(ctx: &ExecutionContext) -> Result<()> { exe.status_checked() } +pub fn run_waydroid(ctx: &ExecutionContext) -> Result<()> { + let sudo = require_option(ctx.sudo().as_ref(), REQUIRE_SUDO.to_string())?; + let waydroid = require("waydroid")?; + let status = ctx.run_type().execute(&waydroid).arg("status").output_checked_utf8()?; + // example output of `waydroid status`: + // + // ```sh + // $ waydroid status + // Session: RUNNING + // Container: RUNNING + // Vendor type: MAINLINE + // IP address: 192.168.240.112 + // Session user: w568w(1000) + // Wayland display: wayland-0 + // ``` + // + // ```sh + // $ waydroid status + // Session: STOPPED + // Vendor type: MAINLINE + // ``` + let session = status + .stdout + .lines() + .find(|line| line.contains("Session:")) + .expect("the output of `waydroid status` should contain `Session:`"); + let is_container_running = session.contains("RUNNING"); + let assume_yes = ctx.config().yes(Step::Waydroid); + + print_separator("Waydroid"); + + if is_container_running && !assume_yes { + let update_allowed = + prompt_yesno("Going to execute `waydroid upgrade`, which would STOP the running container, is this ok?")?; + if !update_allowed { + return Err(SkipStep("Skip the Waydroid step because the user don't want to proceed".to_string()).into()); + } + } + ctx.run_type() + .execute(sudo) + .arg(&waydroid) + .arg("upgrade") + .status_checked() +} + #[cfg(test)] mod tests { use super::*;