fix: support large files in comparisons
Replace the 16 MiB comparison rejection with independent bounded per-side loading and frozen Working blobs. Bound diff computation, defer large inline highlighting, index source-row navigation, and expose actual load failures. Verified the real 52.3 MB parser through repository/session APIs and terminal rendering with EOF/start navigation.
This commit is contained in:
@@ -4612,6 +4612,68 @@ fn hiding_diff_explorer_reclaims_workspace_and_restores_its_geometry() {
|
||||
assert_eq!(panels.files.unwrap().0, original[0].0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unavailable_file_documents_show_the_actual_error_in_managed_workspaces() {
|
||||
let mut file = deletion_file();
|
||||
file.loaded = false;
|
||||
let mut diff = diff_comparison(vec![file]);
|
||||
diff.loading = false;
|
||||
diff.error = Some("parser.c exceeds 128 MiB file limit".into());
|
||||
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(80, 12)).unwrap();
|
||||
let mut panels = WheelPanels {
|
||||
workspace_managed: true,
|
||||
..WheelPanels::default()
|
||||
};
|
||||
terminal
|
||||
.draw(|frame| {
|
||||
panels.draw_documents(frame, &diff, frame.area(), None, None);
|
||||
})
|
||||
.unwrap();
|
||||
let text = screen_text(&terminal);
|
||||
assert!(text.contains("parser.c exceeds 128 MiB file limit"));
|
||||
assert!(!text.contains("select the file to retry"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn large_generated_additions_render_first_scroll_and_final_rows_without_reparsing() {
|
||||
let after = (0..25_000)
|
||||
.map(|row| format!("state_row_{row:05} = 1234567890123456789012345678901234567890;"))
|
||||
.collect::<Vec<_>>();
|
||||
let hunks = crate::diff::line_hunks(&[], false, &after, true);
|
||||
let mut diff = diff_comparison(vec![ChangedFile {
|
||||
path: "parser.c".into(),
|
||||
old_path: None,
|
||||
status: FileStatus::Added,
|
||||
loaded: true,
|
||||
before: Vec::new(),
|
||||
after,
|
||||
before_eof: false,
|
||||
after_eof: true,
|
||||
hunks,
|
||||
notice: None,
|
||||
}]);
|
||||
diff.files_visible = false;
|
||||
diff.focus = Focus::After;
|
||||
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(100, 12)).unwrap();
|
||||
let mut panels = WheelPanels::default();
|
||||
let mut counts = None;
|
||||
for row in [0, 3, 12_500, 24_999] {
|
||||
diff.reveal_source_row(Focus::After, row);
|
||||
render_diff(&mut terminal, &diff, &mut panels);
|
||||
assert!(screen_text(&terminal).contains(&format!("state_row_{row:05}")));
|
||||
let syntax = panels.diff_syntax.as_ref().unwrap();
|
||||
assert_eq!(
|
||||
*counts.get_or_insert(syntax.after.parse_counts()),
|
||||
syntax.after.parse_counts()
|
||||
);
|
||||
assert!(syntax.after.error().is_some());
|
||||
assert_eq!(
|
||||
diff.comparison.as_ref().unwrap().files[0].after.len(),
|
||||
25_000
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn diff_notices_empty_comparisons_and_tiny_layouts_remain_renderable() {
|
||||
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(100, 12)).unwrap();
|
||||
|
||||
Reference in New Issue
Block a user