From 202897ba35b44efd446fa36c1b1c35b567bf5cec Mon Sep 17 00:00:00 2001 From: Laura Demkowicz-Duffy Date: Tue, 19 Nov 2024 01:17:51 +0000 Subject: [PATCH] refactor: disable julia startup file for julia package update (#983) * refactor(julia): disable julia startup file for julia package update * feat(julia): add configuration option for julia startup file * fix: deny unknown fields on JuliaConfig deserialisation Co-authored-by: SteveLauC * doc(julia): clarify startup_file option purpose --------- Co-authored-by: SteveLauC --- config.example.toml | 8 ++++++++ src/config.rs | 17 +++++++++++++++++ src/steps/generic.rs | 13 +++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/config.example.toml b/config.example.toml index 30354f18..080f53ac 100644 --- a/config.example.toml +++ b/config.example.toml @@ -270,3 +270,11 @@ # and the update will be installed system-wide, i.e., available to all users. # (default: false) # use_sudo = false + +[julia] +# If disabled, Topgrade invokes julia with the --startup-file=no CLI option. +# +# This may be desirable to avoid loading outdated packages with "using" directives +# in the startup file, which might cause the update run to fail. +# (default: true) +# startup_file = true diff --git a/src/config.rs b/src/config.rs index e09c4a0b..eab7b336 100644 --- a/src/config.rs +++ b/src/config.rs @@ -452,6 +452,12 @@ pub struct Lensfun { use_sudo: Option, } +#[derive(Deserialize, Default, Debug, Merge)] +#[serde(deny_unknown_fields)] +pub struct JuliaConfig { + startup_file: Option, +} + #[derive(Deserialize, Default, Debug, Merge)] #[serde(deny_unknown_fields)] /// Configuration file @@ -518,6 +524,9 @@ pub struct ConfigFile { #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)] lensfun: Option, + + #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)] + julia: Option, } fn config_directory() -> PathBuf { @@ -1632,6 +1641,14 @@ impl Config { .and_then(|lensfun| lensfun.use_sudo) .unwrap_or(false) } + + pub fn julia_use_startup_file(&self) -> bool { + self.config_file + .julia + .as_ref() + .and_then(|julia| julia.startup_file) + .unwrap_or(true) + } } #[cfg(test)] diff --git a/src/steps/generic.rs b/src/steps/generic.rs index ba3e1a2c..c4e323dd 100644 --- a/src/steps/generic.rs +++ b/src/steps/generic.rs @@ -908,10 +908,15 @@ pub fn update_julia_packages(ctx: &ExecutionContext) -> Result<()> { print_separator(t!("Julia Packages")); - ctx.run_type() - .execute(julia) - .args(["-e", "using Pkg; Pkg.update()"]) - .status_checked() + let mut executor = ctx.run_type().execute(julia); + + executor.arg(if ctx.config().julia_use_startup_file() { + "--startup-file=yes" + } else { + "--startup-file=no" + }); + + executor.args(["-e", "using Pkg; Pkg.update()"]).status_checked() } pub fn run_helm_repo_update(ctx: &ExecutionContext) -> Result<()> {