diff --git a/objdiff-cli/src/cmd/diff.rs b/objdiff-cli/src/cmd/diff.rs index 05afd9c..30d501c 100644 --- a/objdiff-cli/src/cmd/diff.rs +++ b/objdiff-cli/src/cmd/diff.rs @@ -22,7 +22,7 @@ use crossterm::{ use objdiff_core::{ bindings::diff::DiffResult, build::{ - BuildConfig, + BuildConfig, BuildStatus, watcher::{Watcher, create_watcher}, }, config::{ @@ -251,6 +251,8 @@ pub struct AppState { pub project_config: Option, pub target_path: Option, pub base_path: Option, + pub left_status: Option, + pub right_status: Option, pub left_obj: Option<(Object, ObjectDiff)>, pub right_obj: Option<(Object, ObjectDiff)>, pub prev_obj: Option<(Object, ObjectDiff)>, @@ -348,6 +350,8 @@ impl AppState { JobResult::None => unreachable!("Unexpected JobResult::None"), JobResult::ObjDiff(result) => { let result = result.unwrap(); + self.left_status = Some(result.first_status); + self.right_status = Some(result.second_status); self.left_obj = result.first_obj; self.right_obj = result.second_obj; self.reload_time = Some(result.time); @@ -388,6 +392,8 @@ fn run_interactive( project_config, target_path, base_path, + left_status: None, + right_status: None, left_obj: None, right_obj: None, prev_obj: None, diff --git a/objdiff-cli/src/views/function_diff.rs b/objdiff-cli/src/views/function_diff.rs index b41ae1e..0c95cd4 100644 --- a/objdiff-cli/src/views/function_diff.rs +++ b/objdiff-cli/src/views/function_diff.rs @@ -1,8 +1,9 @@ use core::cmp::Ordering; -use anyhow::{Result, bail}; +use anyhow::Result; use crossterm::event::{Event, KeyCode, KeyEventKind, KeyModifiers, MouseButton, MouseEventKind}; use objdiff_core::{ + build::BuildStatus, diff::{ DiffObjConfig, FunctionRelocDiffs, InstructionDiffKind, ObjectDiff, SymbolDiff, display::{DiffText, DiffTextColor, HighlightKind, display_row}, @@ -126,6 +127,11 @@ impl UiView for FunctionDiffUi { ); max_width = max_width.max(text.width()); left_text = Some(text); + } else if let Some(status) = &state.left_status { + let mut text = Text::default(); + self.print_build_status(&mut text, status); + max_width = max_width.max(text.width()); + left_text = Some(text); } let mut right_text = None; @@ -155,6 +161,11 @@ impl UiView for FunctionDiffUi { let rect = content_chunks[1].inner(Margin::new(1, 1)); self.print_margin(&mut text, symbol_diff, rect); margin_text = Some(text); + } else if let Some(status) = &state.right_status { + let mut text = Text::default(); + self.print_build_status(&mut text, status); + max_width = max_width.max(text.width()); + right_text = Some(text); } let mut prev_text = None; @@ -453,7 +464,7 @@ impl UiView for FunctionDiffUi { } (Some((_l, _ls, ld)), None) => ld.instruction_rows.len(), (None, Some((_r, _rs, rd))) => rd.instruction_rows.len(), - (None, None) => bail!("Symbol not found: {}", self.symbol_name), + (None, None) => 0, }; self.left_sym = left_sym; self.right_sym = right_sym; @@ -596,6 +607,18 @@ impl FunctionDiffUi { } } } + + fn print_build_status<'a>(&self, out: &mut Text<'a>, status: &'a BuildStatus) { + if !status.cmdline.is_empty() { + out.lines.push(Line::styled(status.cmdline.clone(), Style::new().fg(Color::LightBlue))); + } + for line in status.stdout.lines() { + out.lines.push(Line::styled(line, Style::new().fg(Color::White))); + } + for line in status.stderr.lines() { + out.lines.push(Line::styled(line, Style::new().fg(Color::Red))); + } + } } pub const COLOR_ROTATION: [Color; 7] = [