Skip to content

Commit 3965a03

Browse files
committed
objdiff-cli diff: Show build errors/log
1 parent f1fc29f commit 3965a03

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

objdiff-cli/src/cmd/diff.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crossterm::{
2222
use objdiff_core::{
2323
bindings::diff::DiffResult,
2424
build::{
25-
BuildConfig,
25+
BuildConfig, BuildStatus,
2626
watcher::{Watcher, create_watcher},
2727
},
2828
config::{
@@ -251,6 +251,8 @@ pub struct AppState {
251251
pub project_config: Option<ProjectConfig>,
252252
pub target_path: Option<Utf8PlatformPathBuf>,
253253
pub base_path: Option<Utf8PlatformPathBuf>,
254+
pub left_status: Option<BuildStatus>,
255+
pub right_status: Option<BuildStatus>,
254256
pub left_obj: Option<(Object, ObjectDiff)>,
255257
pub right_obj: Option<(Object, ObjectDiff)>,
256258
pub prev_obj: Option<(Object, ObjectDiff)>,
@@ -348,6 +350,8 @@ impl AppState {
348350
JobResult::None => unreachable!("Unexpected JobResult::None"),
349351
JobResult::ObjDiff(result) => {
350352
let result = result.unwrap();
353+
self.left_status = Some(result.first_status);
354+
self.right_status = Some(result.second_status);
351355
self.left_obj = result.first_obj;
352356
self.right_obj = result.second_obj;
353357
self.reload_time = Some(result.time);
@@ -388,6 +392,8 @@ fn run_interactive(
388392
project_config,
389393
target_path,
390394
base_path,
395+
left_status: None,
396+
right_status: None,
391397
left_obj: None,
392398
right_obj: None,
393399
prev_obj: None,

objdiff-cli/src/views/function_diff.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use core::cmp::Ordering;
22

3-
use anyhow::{Result, bail};
3+
use anyhow::Result;
44
use crossterm::event::{Event, KeyCode, KeyEventKind, KeyModifiers, MouseButton, MouseEventKind};
55
use objdiff_core::{
6+
build::BuildStatus,
67
diff::{
78
DiffObjConfig, FunctionRelocDiffs, InstructionDiffKind, ObjectDiff, SymbolDiff,
89
display::{DiffText, DiffTextColor, HighlightKind, display_row},
@@ -126,6 +127,11 @@ impl UiView for FunctionDiffUi {
126127
);
127128
max_width = max_width.max(text.width());
128129
left_text = Some(text);
130+
} else if let Some(status) = &state.left_status {
131+
let mut text = Text::default();
132+
self.print_build_status(&mut text, status);
133+
max_width = max_width.max(text.width());
134+
left_text = Some(text);
129135
}
130136

131137
let mut right_text = None;
@@ -155,6 +161,11 @@ impl UiView for FunctionDiffUi {
155161
let rect = content_chunks[1].inner(Margin::new(1, 1));
156162
self.print_margin(&mut text, symbol_diff, rect);
157163
margin_text = Some(text);
164+
} else if let Some(status) = &state.right_status {
165+
let mut text = Text::default();
166+
self.print_build_status(&mut text, status);
167+
max_width = max_width.max(text.width());
168+
right_text = Some(text);
158169
}
159170

160171
let mut prev_text = None;
@@ -453,7 +464,7 @@ impl UiView for FunctionDiffUi {
453464
}
454465
(Some((_l, _ls, ld)), None) => ld.instruction_rows.len(),
455466
(None, Some((_r, _rs, rd))) => rd.instruction_rows.len(),
456-
(None, None) => bail!("Symbol not found: {}", self.symbol_name),
467+
(None, None) => 0,
457468
};
458469
self.left_sym = left_sym;
459470
self.right_sym = right_sym;
@@ -596,6 +607,18 @@ impl FunctionDiffUi {
596607
}
597608
}
598609
}
610+
611+
fn print_build_status<'a>(&self, out: &mut Text<'a>, status: &'a BuildStatus) {
612+
if !status.cmdline.is_empty() {
613+
out.lines.push(Line::styled(status.cmdline.clone(), Style::new().fg(Color::LightBlue)));
614+
}
615+
for line in status.stdout.lines() {
616+
out.lines.push(Line::styled(line, Style::new().fg(Color::White)));
617+
}
618+
for line in status.stderr.lines() {
619+
out.lines.push(Line::styled(line, Style::new().fg(Color::Red)));
620+
}
621+
}
599622
}
600623

601624
pub const COLOR_ROTATION: [Color; 7] = [

0 commit comments

Comments
 (0)