feat: add configurable auto-collapse for large diffs (#1587)
* perf: remove unecessary useEffects * feat: add settings for default diff type collapsing * feat: add setting for max line default collapse * refactor: use object for default collapse config storage * fix: use diff changes for max line count * refactor: use consistent ids as fallback for id-less diffs * chore: ran formatter * chore: revert configurability and use fe defaults for auto-collapse * Debug None additions/deletions for diff (vibe-kanban 72a2a541) crates/utils/src/diff.rs /api/task-attempts/.../diff/ws returns diffs with "additions": null", "deletions": null * use backend additions/deletions --------- Co-authored-by: Louis Knight-Webb <louis@bloop.ai>
This commit is contained in:
@@ -8,7 +8,7 @@ use git2::{
|
||||
use serde::{Deserialize, Serialize};
|
||||
use thiserror::Error;
|
||||
use ts_rs::TS;
|
||||
use utils::diff::{Diff, DiffChangeKind, FileDiffDetails};
|
||||
use utils::diff::{Diff, DiffChangeKind, FileDiffDetails, compute_line_change_counts};
|
||||
|
||||
mod cli;
|
||||
|
||||
@@ -517,16 +517,15 @@ impl GitService {
|
||||
}
|
||||
}
|
||||
|
||||
// If contents are omitted, try to compute line stats via libgit2 Patch
|
||||
let mut additions: Option<usize> = None;
|
||||
let mut deletions: Option<usize> = None;
|
||||
if content_omitted
|
||||
&& let Ok(Some(patch)) = git2::Patch::from_diff(&diff, delta_index)
|
||||
// Always compute line stats via libgit2 Patch
|
||||
let (additions, deletions) = if let Ok(Some(patch)) =
|
||||
git2::Patch::from_diff(&diff, delta_index)
|
||||
&& let Ok((_ctx, adds, dels)) = patch.line_stats()
|
||||
{
|
||||
additions = Some(adds);
|
||||
deletions = Some(dels);
|
||||
}
|
||||
(Some(adds), Some(dels))
|
||||
} else {
|
||||
(None, None)
|
||||
};
|
||||
|
||||
file_diffs.push(Diff {
|
||||
change,
|
||||
@@ -732,6 +731,23 @@ impl GitService {
|
||||
change = DiffChangeKind::PermissionChange;
|
||||
}
|
||||
|
||||
// Compute line stats from available content
|
||||
let (additions, deletions) = match (&old_content, &new_content) {
|
||||
(Some(old), Some(new)) => {
|
||||
let (adds, dels) = compute_line_change_counts(old, new);
|
||||
(Some(adds), Some(dels))
|
||||
}
|
||||
(Some(old), None) => {
|
||||
// File deleted - all lines are deletions
|
||||
(Some(0), Some(old.lines().count()))
|
||||
}
|
||||
(None, Some(new)) => {
|
||||
// File added - all lines are additions
|
||||
(Some(new.lines().count()), Some(0))
|
||||
}
|
||||
(None, None) => (None, None),
|
||||
};
|
||||
|
||||
Diff {
|
||||
change,
|
||||
old_path: old_path_opt,
|
||||
@@ -739,8 +755,8 @@ impl GitService {
|
||||
old_content,
|
||||
new_content,
|
||||
content_omitted,
|
||||
additions: None,
|
||||
deletions: None,
|
||||
additions,
|
||||
deletions,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user