diff --git a/config.example.toml b/config.example.toml index 30354f18..4c3dc991 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 enabled, Topgrade invokes julia with the --startup-file=yes CLI option. +# +# This may be desirable to avoid loading outdated packages with "using" directives +# in the startup file which would cause the update run to fail. +# (default: true) +# startup_file = true diff --git a/src/config.rs b/src/config.rs index e09c4a0b..04026e9f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -452,6 +452,11 @@ pub struct Lensfun { use_sudo: Option, } +#[derive(Deserialize, Default, Debug, Merge)] +pub struct JuliaConfig { + startup_file: Option, +} + #[derive(Deserialize, Default, Debug, Merge)] #[serde(deny_unknown_fields)] /// Configuration file @@ -518,6 +523,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 +1640,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 f44b499f..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(["--startup-file=no", "-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<()> {