mirror of
https://github.com/encounter/objdiff.git
synced 2025-06-07 15:13:47 +00:00
objdiff-cli diff: Show build errors/log
This commit is contained in:
parent
f1fc29f77e
commit
3965a035fa
@ -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,
|
||||||
|
@ -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] = [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user