use crate::command::CommandExt; use crate::execution_context::ExecutionContext; use crate::executor::RunType; use crate::terminal::{print_separator, prompt_yesno}; use crate::{utils::require, Step}; use color_eyre::eyre::Result; use std::fs; use std::process::Command; use tracing::debug; pub fn run_macports(ctx: &ExecutionContext) -> Result<()> { require("port")?; let sudo = ctx.sudo().as_ref().unwrap(); print_separator("MacPorts"); ctx.run_type() .execute(sudo) .args(["port", "selfupdate"]) .status_checked()?; ctx.run_type() .execute(sudo) .args(["port", "-u", "upgrade", "outdated"]) .status_checked()?; if ctx.config().cleanup() { ctx.run_type() .execute(sudo) .args(["port", "-N", "reclaim"]) .status_checked()?; } Ok(()) } pub fn run_mas(run_type: RunType) -> Result<()> { let mas = require("mas")?; print_separator("macOS App Store"); run_type.execute(mas).arg("upgrade").status_checked() } pub fn upgrade_macos(ctx: &ExecutionContext) -> Result<()> { print_separator("macOS system update"); let should_ask = !(ctx.config().yes(Step::System)) || (ctx.config().dry_run()); if should_ask { println!("Finding available software"); if system_update_available()? { let answer = prompt_yesno("A system update is available. Do you wish to install it?")?; if !answer { return Ok(()); } println!(); } else { println!("No new software available."); return Ok(()); } } let mut command = ctx.run_type().execute("softwareupdate"); command.args(["--install", "--all"]); if should_ask { command.arg("--no-scan"); } command.status_checked() } fn system_update_available() -> Result { let output = Command::new("softwareupdate").arg("--list").output_checked_utf8()?; debug!("{:?}", output); Ok(!output.stderr.contains("No new software available")) } pub fn run_sparkle(ctx: &ExecutionContext) -> Result<()> { let sparkle = require("sparkle")?; print_separator("Sparkle"); for application in (fs::read_dir("/Applications")?).flatten() { let probe = Command::new(&sparkle) .args(["--probe", "--application"]) .arg(application.path()) .output_checked_utf8(); if probe.is_ok() { let mut command = ctx.run_type().execute(&sparkle); command.args(["bundle", "--check-immediately", "--application"]); command.arg(application.path()); command.status_checked()?; } } Ok(()) }