Better Vagrant error handling

This commit is contained in:
Roey Darwish Dror
2020-06-25 08:37:29 +03:00
parent 124b3f2506
commit 4fff6ba56f
3 changed files with 12 additions and 4 deletions

View File

@@ -6,6 +6,9 @@ pub enum TopgradeError {
#[error("{0}")] #[error("{0}")]
ProcessFailed(ExitStatus), ProcessFailed(ExitStatus),
#[error("{0}: {1}")]
ProcessFailedWithOutput(ExitStatus, String),
#[error("Sudo is required for this step")] #[error("Sudo is required for this step")]
#[allow(dead_code)] #[allow(dead_code)]
SudoRequired, SudoRequired,

View File

@@ -245,7 +245,8 @@ impl CommandExt for Command {
trace!("Output of {:?}: {:?}", self, output); trace!("Output of {:?}: {:?}", self, output);
let status = output.status; let status = output.status;
if !status.success() { if !status.success() {
return Err(TopgradeError::ProcessFailed(status).into()); let stderr = String::from_utf8(output.stderr).unwrap_or_default();
return Err(TopgradeError::ProcessFailedWithOutput(status, stderr).into());
} }
Ok(String::from_utf8(output.stdout)?) Ok(String::from_utf8(output.stdout)?)
} }

View File

@@ -3,7 +3,7 @@ use crate::executor::CommandExt;
use crate::terminal::print_separator; use crate::terminal::print_separator;
use crate::{error::SkipStep, utils}; use crate::{error::SkipStep, utils};
use anyhow::Result; use anyhow::Result;
use log::debug; use log::{debug, error};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::process::Command; use std::process::Command;
use std::{fmt::Display, rc::Rc, str::FromStr}; use std::{fmt::Display, rc::Rc, str::FromStr};
@@ -159,9 +159,13 @@ pub fn collect_boxes(ctx: &ExecutionContext) -> Result<Vec<VagrantBox>> {
let mut result = Vec::new(); let mut result = Vec::new();
for directory in directories { for directory in directories {
let mut boxes = vagrant.get_boxes(directory)?; match vagrant.get_boxes(directory) {
Ok(mut boxes) => {
result.append(&mut boxes); result.append(&mut boxes);
} }
Err(e) => error!("Error collecting vagrant boxes from {}: {}", directory, e),
};
}
Ok(result) Ok(result)
} }