From f2dfa1e475e1465768acbf93fc1c9f5ecf0820d8 Mon Sep 17 00:00:00 2001 From: SteveLauC Date: Sun, 30 Jun 2024 19:17:30 +0800 Subject: [PATCH 1/2] fix: consider TMUX_PLUGIN_MANAGER_PATH when searching tpm binary (#835) * fix: consider TMUX_PLUGIN_MANAGER_PATH when searching tpm binary * fix: correct update_plugins path when env var is present --- src/steps/tmux.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/steps/tmux.rs b/src/steps/tmux.rs index 444a49b5..f8286fd4 100644 --- a/src/steps/tmux.rs +++ b/src/steps/tmux.rs @@ -18,7 +18,14 @@ use crate::{ use std::os::unix::process::CommandExt as _; pub fn run_tpm(ctx: &ExecutionContext) -> Result<()> { - let tpm = HOME_DIR.join(".tmux/plugins/tpm/bin/update_plugins").require()?; + let tpm = match env::var("TMUX_PLUGIN_MANAGER_PATH") { + // If `TMUX_PLUGIN_MANAGER_PATH` is set, search for + // `$TMUX_PLUGIN_MANAGER_PATH/bin/install_plugins/tpm/bin/update_plugins` + Ok(var) => PathBuf::from(var).join("bin/install_plugins/tpm/bin/update_plugins"), + // Otherwise, use the default location `~/.tmux/plugins/tpm/bin/update_plugins` + Err(_) => HOME_DIR.join(".tmux/plugins/tpm/bin/update_plugins"), + } + .require()?; print_separator("tmux plugins"); From 55e1bbf2b9d97e0736e9439f671b28e92857e0fe Mon Sep 17 00:00:00 2001 From: SteveLauC Date: Sun, 30 Jun 2024 22:41:09 +0800 Subject: [PATCH 2/2] feat: new step Lensfun's database update (#839) * feat: new step Lensfun's database update * refactor: take 1 as a success exit code --- config.example.toml | 7 +++++++ src/config.rs | 18 ++++++++++++++++++ src/main.rs | 3 +++ src/steps/generic.rs | 25 +++++++++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/config.example.toml b/config.example.toml index ea29912b..68beee63 100644 --- a/config.example.toml +++ b/config.example.toml @@ -244,3 +244,10 @@ [containers] # Specify the containers to ignore while updating (Wildcard supported) # ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest", "docker.io*"] + +[lensfun] +# If disabled, Topgrade invokes `lensfun‑update‑data` without root priviledge, +# then the update will be only available to you. Otherwise, `sudo` is required, +# and the update will be installed system-wide, i.e., available to all users. +# (default: false) +# use_sudo = false diff --git a/src/config.rs b/src/config.rs index c172c56d..79920658 100644 --- a/src/config.rs +++ b/src/config.rs @@ -101,6 +101,7 @@ pub enum Step { Helix, Krew, Lure, + Lensfun, Macports, Mamba, Miktex, @@ -396,6 +397,12 @@ pub struct Misc { log_filters: Option>, } +#[derive(Deserialize, Default, Debug, Merge)] +#[serde(deny_unknown_fields)] +pub struct Lensfun { + use_sudo: Option, +} + #[derive(Deserialize, Default, Debug, Merge)] #[serde(deny_unknown_fields)] /// Configuration file @@ -456,6 +463,9 @@ pub struct ConfigFile { #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)] distrobox: Option, + + #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)] + lensfun: Option, } fn config_directory() -> PathBuf { @@ -1523,6 +1533,14 @@ impl Config { self.opt.custom_commands.iter().any(|s| s == name) } + + pub fn lensfun_use_sudo(&self) -> bool { + self.config_file + .lensfun + .as_ref() + .and_then(|lensfun| lensfun.use_sudo) + .unwrap_or(false) + } } #[cfg(test)] diff --git a/src/main.rs b/src/main.rs index e80e0df9..cbaa632d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -412,6 +412,9 @@ fn run() -> Result<()> { runner.execute(Step::PlatformioCore, "PlatformIO Core", || { generic::run_platform_io(&ctx) })?; + runner.execute(Step::Lensfun, "Lensfun's database update", || { + generic::run_lensfun_update_data(&ctx) + })?; if should_run_powershell { runner.execute(Step::Powershell, "Powershell Modules Update", || { diff --git a/src/steps/generic.rs b/src/steps/generic.rs index 091da952..9a70d494 100644 --- a/src/steps/generic.rs +++ b/src/steps/generic.rs @@ -977,3 +977,28 @@ pub fn run_platform_io(ctx: &ExecutionContext) -> Result<()> { ctx.run_type().execute(bin_path).arg("upgrade").status_checked() } + +/// Run `lensfun-update-data` to update lensfun database. +/// +/// `sudo` will be used if `use_sudo` configuration entry is set to true. +pub fn run_lensfun_update_data(ctx: &ExecutionContext) -> Result<()> { + const SEPARATOR: &str = "Lensfun's database update"; + let lensfun_update_data = require("lensfun-update-data")?; + const EXIT_CODE_WHEN_NO_UPDATE: i32 = 1; + + if ctx.config().lensfun_use_sudo() { + let sudo = require_option(ctx.sudo().as_ref(), REQUIRE_SUDO.to_string())?; + print_separator(SEPARATOR); + ctx.run_type() + .execute(sudo) + .arg(lensfun_update_data) + // `lensfun-update-data` returns 1 when there is no update available + // which should be considered success + .status_checked_with_codes(&[EXIT_CODE_WHEN_NO_UPDATE]) + } else { + print_separator(SEPARATOR); + ctx.run_type() + .execute(lensfun_update_data) + .status_checked_with_codes(&[EXIT_CODE_WHEN_NO_UPDATE]) + } +}