diff --git a/BREAKINGCHANGES_dev.md b/BREAKINGCHANGES_dev.md index e69de29b..2da49f26 100644 --- a/BREAKINGCHANGES_dev.md +++ b/BREAKINGCHANGES_dev.md @@ -0,0 +1,3 @@ +1. The `jet_brains_toolbox` step was renamed to `jetbrains_toolbox`. If you're + using the old name in your configuration file in the `disable` or `only` + fields, simply change it to `jetbrains_toolbox`. diff --git a/src/config.rs b/src/config.rs index c7870630..efaa5dc4 100644 --- a/src/config.rs +++ b/src/config.rs @@ -52,6 +52,7 @@ pub type Commands = BTreeMap; #[strum(serialize_all = "snake_case")] pub enum Step { AM, + AndroidStudio, AppMan, Aqua, Asdf, @@ -99,7 +100,23 @@ pub enum Step { Helix, Helm, HomeManager, - JetBrainsToolbox, + // These names are miscapitalized on purpose, so the CLI name is + // `jetbrains_pycharm` instead of `jet_brains_py_charm`. + JetbrainsAqua, + JetbrainsClion, + JetbrainsDatagrip, + JetbrainsDataspell, + JetbrainsGateway, + JetbrainsGoland, + JetbrainsIdea, + JetbrainsMps, + JetbrainsPhpstorm, + JetbrainsPycharm, + JetbrainsRider, + JetbrainsRubymine, + JetbrainsRustrover, + JetbrainsToolbox, + JetbrainsWebstorm, Jetpack, Julia, Juliaup, diff --git a/src/main.rs b/src/main.rs index ea453c0f..f3b3b3e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -446,9 +446,62 @@ fn run() -> Result<()> { runner.execute(Step::Aqua, "aqua", || generic::run_aqua(&ctx))?; runner.execute(Step::Bun, "bun", || generic::run_bun(&ctx))?; runner.execute(Step::Zigup, "zigup", || generic::run_zigup(&ctx))?; - runner.execute(Step::JetBrainsToolbox, "JetBrains Toolbox", || { + runner.execute(Step::JetbrainsToolbox, "JetBrains Toolbox", || { generic::run_jetbrains_toolbox(&ctx) })?; + runner.execute(Step::AndroidStudio, "Android Studio plugins", || { + generic::run_android_studio(&ctx) + })?; + runner.execute(Step::JetbrainsAqua, "JetBrains Aqua plugins", || { + generic::run_jetbrains_aqua(&ctx) + })?; + runner.execute(Step::JetbrainsClion, "JetBrains CLion plugins", || { + generic::run_jetbrains_clion(&ctx) + })?; + runner.execute(Step::JetbrainsDatagrip, "JetBrains DataGrip plugins", || { + generic::run_jetbrains_datagrip(&ctx) + })?; + runner.execute(Step::JetbrainsDataspell, "JetBrains DataSpell plugins", || { + generic::run_jetbrains_dataspell(&ctx) + })?; + // JetBrains dotCover has no CLI + // JetBrains dotMemory has no CLI + // JetBrains dotPeek has no CLI + // JetBrains dotTrace has no CLI + // JetBrains Fleet has a different CLI without a `fleet update` command. + runner.execute(Step::JetbrainsGateway, "JetBrains Gateway plugins", || { + generic::run_jetbrains_gateway(&ctx) + })?; + runner.execute(Step::JetbrainsGoland, "JetBrains GoLand plugins", || { + generic::run_jetbrains_goland(&ctx) + })?; + runner.execute(Step::JetbrainsIdea, "JetBrains IntelliJ IDEA plugins", || { + generic::run_jetbrains_idea(&ctx) + })?; + runner.execute(Step::JetbrainsMps, "JetBrains MPS plugins", || { + generic::run_jetbrains_mps(&ctx) + })?; + runner.execute(Step::JetbrainsPhpstorm, "JetBrains PhpStorm plugins", || { + generic::run_jetbrains_phpstorm(&ctx) + })?; + runner.execute(Step::JetbrainsPycharm, "JetBrains PyCharm plugins", || { + generic::run_jetbrains_pycharm(&ctx) + })?; + // JetBrains ReSharper has no CLI (it's a VSCode extension) + // JetBrains ReSharper C++ has no CLI (it's a VSCode extension) + runner.execute(Step::JetbrainsRider, "JetBrains Rider plugins", || { + generic::run_jetbrains_rider(&ctx) + })?; + runner.execute(Step::JetbrainsRubymine, "JetBrains RubyMine plugins", || { + generic::run_jetbrains_rubymine(&ctx) + })?; + runner.execute(Step::JetbrainsRustrover, "JetBrains RustRover plugins", || { + generic::run_jetbrains_rustrover(&ctx) + })?; + // JetBrains Space Desktop does not have a CLI + runner.execute(Step::JetbrainsWebstorm, "JetBrains WebStorm plugins", || { + generic::run_jetbrains_webstorm(&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 569e1922..ed3b705f 100644 --- a/src/steps/generic.rs +++ b/src/steps/generic.rs @@ -221,15 +221,46 @@ pub fn run_apm(ctx: &ExecutionContext) -> Result<()> { .status_checked() } -pub fn run_aqua(ctx: &ExecutionContext) -> Result<()> { +enum Aqua { + JetBrainsAqua(PathBuf), + AquaCLI(PathBuf), +} + +impl Aqua { + fn aqua_cli(self) -> Result { + match self { + Aqua::AquaCLI(aqua) => Ok(aqua), + Aqua::JetBrainsAqua(_) => { + Err(SkipStep("Command `aqua` probably points to JetBrains Aqua".to_string()).into()) + } + } + } + + fn jetbrains_aqua(self) -> Result { + match self { + Aqua::JetBrainsAqua(path) => Ok(path), + Aqua::AquaCLI(_) => Err(SkipStep("Command `aqua` probably points to Aqua CLI".to_string()).into()), + } + } +} + +fn get_aqua(ctx: &ExecutionContext) -> Result { let aqua = require("aqua")?; - // Check if `aqua --help` mentions "aqua". JetBrains aqua does not, aqua CLI does. + // Check if `aqua --help` mentions "aqua". JetBrains Aqua does not, Aqua CLI does. let output = ctx.run_type().execute(&aqua).arg("--help").output_checked()?; - if !String::from_utf8(output.stdout)?.contains("aqua") { - return Err(SkipStep("Command aqua probably points to JetBrains Aqua".to_string()).into()); + if String::from_utf8(output.stdout)?.contains("aqua") { + debug!("Detected `aqua` as Aqua CLI"); + Ok(Aqua::AquaCLI(aqua)) + } else { + debug!("Detected `aqua` as JetBrains Aqua"); + Ok(Aqua::JetBrainsAqua(aqua)) } +} + +pub fn run_aqua(ctx: &ExecutionContext) -> Result<()> { + let aqua = get_aqua(ctx)?.aqua_cli()?; print_separator("Aqua"); if ctx.run_type().dry() { @@ -1467,3 +1498,76 @@ pub fn run_jetbrains_toolbox(_ctx: &ExecutionContext) -> Result<()> { } } } + +fn run_jetbrains_ide(ctx: &ExecutionContext, bin: PathBuf, name: &str) -> Result<()> { + print_separator(format!("JetBrains {name} plugins")); + + // The `update` command is undocumented, but tested on all of the below. + ctx.run_type().execute(bin).arg("update").status_checked() +} + +pub fn run_android_studio(ctx: &ExecutionContext) -> Result<()> { + // We don't use `run_jetbrains_ide` here because that would print "JetBrains Android Studio", + // which is incorrect as Android Studio is made by Google. Just "Android Studio" is fine. + let bin = require("studio")?; + + print_separator("Android Studio plugins"); + + ctx.run_type().execute(bin).arg("update").status_checked() +} + +pub fn run_jetbrains_aqua(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, get_aqua(ctx)?.jetbrains_aqua()?, "Aqua") +} + +pub fn run_jetbrains_clion(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("clion")?, "CLion") +} + +pub fn run_jetbrains_datagrip(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("datagrip")?, "DataGrip") +} + +pub fn run_jetbrains_dataspell(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("dataspell")?, "DataSpell") +} + +pub fn run_jetbrains_gateway(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("gateway")?, "Gateway") +} + +pub fn run_jetbrains_goland(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("goland")?, "Goland") +} + +pub fn run_jetbrains_idea(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("idea")?, "IntelliJ IDEA") +} + +pub fn run_jetbrains_mps(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("mps")?, "MPS") +} + +pub fn run_jetbrains_phpstorm(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("phpstorm")?, "PhpStorm") +} + +pub fn run_jetbrains_pycharm(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("pycharm")?, "PyCharm") +} + +pub fn run_jetbrains_rider(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("rider")?, "Rider") +} + +pub fn run_jetbrains_rubymine(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("rubymine")?, "RubyMine") +} + +pub fn run_jetbrains_rustrover(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("rustrover")?, "RustRover") +} + +pub fn run_jetbrains_webstorm(ctx: &ExecutionContext) -> Result<()> { + run_jetbrains_ide(ctx, require("webstorm")?, "WebStorm") +}