Fix "Only one instance of <IDE> can be run at a a time." error (#1123)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
use color_eyre::eyre::eyre;
|
|
||||||
use color_eyre::eyre::Context;
|
use color_eyre::eyre::Context;
|
||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
|
use color_eyre::eyre::{eyre, OptionExt};
|
||||||
use jetbrains_toolbox_updater::{find_jetbrains_toolbox, update_jetbrains_toolbox, FindError};
|
use jetbrains_toolbox_updater::{find_jetbrains_toolbox, update_jetbrains_toolbox, FindError};
|
||||||
use regex::bytes::Regex;
|
use regex::bytes::Regex;
|
||||||
use rust_i18n::t;
|
use rust_i18n::t;
|
||||||
@@ -12,7 +12,7 @@ use std::sync::LazyLock;
|
|||||||
use std::{env, path::Path};
|
use std::{env, path::Path};
|
||||||
use std::{fs, io::Write};
|
use std::{fs, io::Write};
|
||||||
use tempfile::tempfile_in;
|
use tempfile::tempfile_in;
|
||||||
use tracing::{debug, error};
|
use tracing::{debug, error, warn};
|
||||||
|
|
||||||
use crate::command::{CommandExt, Utf8Output};
|
use crate::command::{CommandExt, Utf8Output};
|
||||||
use crate::execution_context::ExecutionContext;
|
use crate::execution_context::ExecutionContext;
|
||||||
@@ -1549,21 +1549,52 @@ pub fn run_jetbrains_toolbox(_ctx: &ExecutionContext) -> Result<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_jetbrains_ide(ctx: &ExecutionContext, bin: PathBuf, name: &str) -> Result<()> {
|
fn run_jetbrains_ide_generic<const IS_JETBRAINS: bool>(ctx: &ExecutionContext, bin: PathBuf, name: &str) -> Result<()> {
|
||||||
print_separator(format!("JetBrains {name} plugins"));
|
let prefix = if IS_JETBRAINS { "JetBrains " } else { "" };
|
||||||
|
print_separator(format!("{prefix}{name} plugins"));
|
||||||
|
|
||||||
// The `update` command is undocumented, but tested on all of the below.
|
// The `update` command is undocumented, but tested on all of the below.
|
||||||
ctx.run_type().execute(bin).arg("update").status_checked()
|
let output = ctx.run_type().execute(&bin).arg("update").output()?;
|
||||||
|
let output = match output {
|
||||||
|
ExecutorOutput::Dry => return Ok(()),
|
||||||
|
ExecutorOutput::Wet(output) => output,
|
||||||
|
};
|
||||||
|
// Write the output which we swallowed in all cases
|
||||||
|
std::io::stdout().lock().write_all(&output.stdout).unwrap();
|
||||||
|
std::io::stderr().lock().write_all(&output.stderr).unwrap();
|
||||||
|
|
||||||
|
let stdout = String::from_utf8(output.stdout.clone()).wrap_err("Expected valid UTF-8 output")?;
|
||||||
|
|
||||||
|
// "Only one instance of RustRover can be run at a time."
|
||||||
|
if stdout.contains("Only one instance of ") && stdout.contains(" can be run at a time.") {
|
||||||
|
// It's always paired with status code 1
|
||||||
|
let status_code = output
|
||||||
|
.status
|
||||||
|
.code()
|
||||||
|
.ok_or_eyre("Failed to get status code; was killed with signal")?;
|
||||||
|
if status_code != 1 {
|
||||||
|
return Err(eyre!("Expected status code 1 ('Only one instance of <IDE> can be run at a time.'), but found status code {}. Output: {output:?}", status_code));
|
||||||
|
}
|
||||||
|
// Don't crash, but don't be silent either
|
||||||
|
warn!("{name} is already running, can't update it now.");
|
||||||
|
Err(SkipStep(format!("{name} is already running, can't update it now.")).into())
|
||||||
|
} else if !output.status.success() {
|
||||||
|
// Unknown failure
|
||||||
|
Err(eyre!("Running `{bin:?} update` failed. Output: {output:?}"))
|
||||||
|
} else {
|
||||||
|
// Success. Output was already written above
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_jetbrains_ide(ctx: &ExecutionContext, bin: PathBuf, name: &str) -> Result<()> {
|
||||||
|
run_jetbrains_ide_generic::<true>(ctx, bin, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_android_studio(ctx: &ExecutionContext) -> Result<()> {
|
pub fn run_android_studio(ctx: &ExecutionContext) -> Result<()> {
|
||||||
// We don't use `run_jetbrains_ide` here because that would print "JetBrains Android Studio",
|
// 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.
|
// which is incorrect as Android Studio is made by Google. Just "Android Studio" is fine.
|
||||||
let bin = require("studio")?;
|
run_jetbrains_ide_generic::<false>(ctx, require("studio")?, "Android Studio")
|
||||||
|
|
||||||
print_separator("Android Studio plugins");
|
|
||||||
|
|
||||||
ctx.run_type().execute(bin).arg("update").status_checked()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_jetbrains_aqua(ctx: &ExecutionContext) -> Result<()> {
|
pub fn run_jetbrains_aqua(ctx: &ExecutionContext) -> Result<()> {
|
||||||
|
|||||||
Reference in New Issue
Block a user