diff --git a/README.md b/README.md index e51be820..d5499d19 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Visit the documentation at [topgrade-rs.github.io](https://topgrade-rs.github.io > **Warning** > Work in Progress -## Customization +## Configuration See `config.example.toml` for an example configuration file. @@ -55,6 +55,14 @@ The configuration should be placed in the following paths depending on the opera - **Windows** - `%APPDATA%/topgrade.toml` - **macOS** and **other Unix systems** - `${XDG_CONFIG_HOME:-~/.config}/topgrade.toml` +### Custom Commands + +Custom commands can be defined in the config file which can be run before, during, or after the inbuilt commands, as required. +By default, the custom commands are run using a new shell according to the `$SHELL` environment variable on unix (falls back to `sh`) or `pwsh` on windows (falls back to `powershell`). + +On unix, if you want to run your command using an interactive shell, for example to source your shell's rc files, you can add `-i` at the start of your custom command. +But note that this requires the command to exit the shell correctly or else the shell will hang indefinitely. + ## Remote Execution You can specify a key called `remote_topgrades` in the configuration file. diff --git a/config.example.toml b/config.example.toml index 4c6bff93..0530a50b 100644 --- a/config.example.toml +++ b/config.example.toml @@ -74,6 +74,7 @@ # Custom commands [commands] #"Python Environment" = "~/dev/.env/bin/pip install -i https://pypi.python.org/simple -U --upgrade-strategy eager jupyter" +#"Custom command using interactive shell (unix)" = "-i vim_upgrade" [brew] #greedy_cask = true diff --git a/src/steps/generic.rs b/src/steps/generic.rs index f096574f..cb2a87f6 100644 --- a/src/steps/generic.rs +++ b/src/steps/generic.rs @@ -505,7 +505,15 @@ pub fn run_myrepos_update(base_dirs: &BaseDirs, run_type: RunType) -> Result<()> pub fn run_custom_command(name: &str, command: &str, ctx: &ExecutionContext) -> Result<()> { print_separator(name); - ctx.run_type().execute(shell()).arg("-c").arg(command).status_checked() + let mut exec = ctx.run_type().execute(shell()); + #[cfg(unix)] + let command = if let Some(command) = command.strip_prefix("-i ") { + exec.arg("-i"); + command + } else { + command + }; + exec.arg("-c").arg(command).status_checked() } pub fn run_composer_update(ctx: &ExecutionContext) -> Result<()> {