objdiff-cli diff: Show build errors/log

This commit is contained in:
Luke Street 2025-03-09 22:25:12 -06:00
parent f1fc29f77e
commit 3965a035fa
2 changed files with 32 additions and 3 deletions

View File

@ -22,7 +22,7 @@ use crossterm::{
use objdiff_core::{ use objdiff_core::{
bindings::diff::DiffResult, bindings::diff::DiffResult,
build::{ build::{
BuildConfig, BuildConfig, BuildStatus,
watcher::{Watcher, create_watcher}, watcher::{Watcher, create_watcher},
}, },
config::{ config::{
@ -251,6 +251,8 @@ pub struct AppState {
pub project_config: Option<ProjectConfig>, pub project_config: Option<ProjectConfig>,
pub target_path: Option<Utf8PlatformPathBuf>, pub target_path: Option<Utf8PlatformPathBuf>,
pub base_path: Option<Utf8PlatformPathBuf>, pub base_path: Option<Utf8PlatformPathBuf>,
pub left_status: Option<BuildStatus>,
pub right_status: Option<BuildStatus>,
pub left_obj: Option<(Object, ObjectDiff)>, pub left_obj: Option<(Object, ObjectDiff)>,
pub right_obj: Option<(Object, ObjectDiff)>, pub right_obj: Option<(Object, ObjectDiff)>,
pub prev_obj: Option<(Object, ObjectDiff)>, pub prev_obj: Option<(Object, ObjectDiff)>,
@ -348,6 +350,8 @@ impl AppState {
JobResult::None => unreachable!("Unexpected JobResult::None"), JobResult::None => unreachable!("Unexpected JobResult::None"),
JobResult::ObjDiff(result) => { JobResult::ObjDiff(result) => {
let result = result.unwrap(); 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.left_obj = result.first_obj;
self.right_obj = result.second_obj; self.right_obj = result.second_obj;
self.reload_time = Some(result.time); self.reload_time = Some(result.time);
@ -388,6 +392,8 @@ fn run_interactive(
project_config, project_config,
target_path, target_path,
base_path, base_path,
left_status: None,
right_status: None,
left_obj: None, left_obj: None,
right_obj: None, right_obj: None,
prev_obj: None, prev_obj: None,

View File

@ -1,8 +1,9 @@
use core::cmp::Ordering; use core::cmp::Ordering;
use anyhow::{Result, bail}; use anyhow::Result;
use crossterm::event::{Event, KeyCode, KeyEventKind, KeyModifiers, MouseButton, MouseEventKind}; use crossterm::event::{Event, KeyCode, KeyEventKind, KeyModifiers, MouseButton, MouseEventKind};
use objdiff_core::{ use objdiff_core::{
build::BuildStatus,
diff::{ diff::{
DiffObjConfig, FunctionRelocDiffs, InstructionDiffKind, ObjectDiff, SymbolDiff, DiffObjConfig, FunctionRelocDiffs, InstructionDiffKind, ObjectDiff, SymbolDiff,
display::{DiffText, DiffTextColor, HighlightKind, display_row}, display::{DiffText, DiffTextColor, HighlightKind, display_row},
@ -126,6 +127,11 @@ impl UiView for FunctionDiffUi {
); );
max_width = max_width.max(text.width()); max_width = max_width.max(text.width());
left_text = Some(text); 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; let mut right_text = None;
@ -155,6 +161,11 @@ impl UiView for FunctionDiffUi {
let rect = content_chunks[1].inner(Margin::new(1, 1)); let rect = content_chunks[1].inner(Margin::new(1, 1));
self.print_margin(&mut text, symbol_diff, rect); self.print_margin(&mut text, symbol_diff, rect);
margin_text = Some(text); 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; let mut prev_text = None;
@ -453,7 +464,7 @@ impl UiView for FunctionDiffUi {
} }
(Some((_l, _ls, ld)), None) => ld.instruction_rows.len(), (Some((_l, _ls, ld)), None) => ld.instruction_rows.len(),
(None, Some((_r, _rs, rd))) => rd.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.left_sym = left_sym;
self.right_sym = right_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] = [ pub const COLOR_ROTATION: [Color; 7] = [