Skip to content

Commit 5573529

Browse files
committed
A first stab at getting the diff back to work with imara-diff
There are a lot of test failures, hopefully an easy fix due to something fundamental being wrong.
1 parent 2809c75 commit 5573529

File tree

2 files changed

+53
-45
lines changed

2 files changed

+53
-45
lines changed

src/index/diff/delegate.rs

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ impl Delegate {
3232
if change.location.contains(&b'.') {
3333
return Ok(Default::default());
3434
}
35-
let mut line_changes = Vec::new();
3635
match change.event {
3736
Addition { entry_mode, id } => {
3837
if let Some(obj) = entry_data(entry_mode, id)? {
@@ -57,55 +56,64 @@ impl Delegate {
5756
if let Some(diff) = change.event.diff().transpose()? {
5857
let location = change.location;
5958

60-
enum Op {
61-
Delete,
62-
Add,
63-
}
64-
diff.lines(
65-
|input: &git::diff::text::imara::intern::InternedInput<&[u8]>| {
66-
|before: Range<u32>, after: Range<u32>| {
67-
let mut line_before = input.before
68-
[before.start as usize..before.end as usize]
69-
.iter()
70-
.map(|&line| input.interner[line]);
71-
let mut line_after = input.after
72-
[after.start as usize..after.end as usize]
73-
.iter()
74-
.map(|&line| input.interner[line]);
75-
match (line_before.next(), line_after.next()) {
76-
(Some(removed), None) => {
77-
line_changes.push(
78-
version_from_json_line(removed.as_bstr(), location)
79-
.map(|v| (v, Op::Delete)),
80-
);
81-
}
82-
(None, Some(inserted)) => {
83-
line_changes.push(
84-
version_from_json_line(inserted.as_bstr(), location)
85-
.map(|v| (v, Op::Add)),
86-
);
59+
let input = diff.line_tokens();
60+
let mut err = None;
61+
git::diff::blob::diff(
62+
diff.algo,
63+
&input,
64+
|before: Range<u32>, after: Range<u32>| {
65+
if err.is_some() {
66+
return;
67+
}
68+
let mut lines_before = input.before
69+
[before.start as usize..before.end as usize]
70+
.iter()
71+
.map(|&line| input.interner[line])
72+
.peekable();
73+
let mut lines_after = input.after
74+
[after.start as usize..after.end as usize]
75+
.iter()
76+
.map(|&line| input.interner[line])
77+
.peekable();
78+
match (lines_before.peek().is_some(), lines_after.next().is_some()) {
79+
(true, false) => {
80+
for removed in lines_before {
81+
match version_from_json_line(removed.as_bstr(), location) {
82+
Ok(version) => {
83+
self.delete_version_ids.insert(version.id());
84+
}
85+
Err(e) => {
86+
err = Some(e);
87+
break;
88+
}
89+
}
8790
}
88-
(Some(_), Some(_)) | (None, None) => {
89-
/* ignore modifications, shouldn't exist */
91+
}
92+
(false, true) => {
93+
for inserted in lines_after {
94+
match version_from_json_line(inserted.as_bstr(), location) {
95+
Ok(version) => {
96+
self.changes.push(if version.yanked {
97+
Change::Yanked(version)
98+
} else {
99+
Change::Added(version)
100+
});
101+
}
102+
Err(e) => {
103+
err = Some(e);
104+
break;
105+
}
106+
}
90107
}
91108
}
109+
(true, true) | (false, false) => {
110+
/* ignore modifications, shouldn't exist */
111+
}
92112
}
93113
},
94114
);
95-
for op in line_changes.drain(..) {
96-
let (version, op) = op?;
97-
match op {
98-
Op::Add => {
99-
self.changes.push(if version.yanked {
100-
Change::Yanked(version)
101-
} else {
102-
Change::Added(version)
103-
});
104-
}
105-
Op::Delete => {
106-
self.delete_version_ids.insert(version.id());
107-
}
108-
};
115+
if let Some(err) = err {
116+
return Err(err.into());
109117
}
110118
}
111119
}

src/index/diff/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub enum Error {
1919
#[error("Couldn't get the tree of a commit for diffing purposes")]
2020
PeelToTree(#[from] git::object::peel::to_kind::Error),
2121
#[error("Failed to diff two trees to find changed crates")]
22-
Diff(#[from] git::object::tree::diff::change::event::diff::Error),
22+
Diff(#[from] git::object::blob::diff::init::Error),
2323
#[error(transparent)]
2424
DiffForEach(#[from] git::object::tree::diff::for_each::Error),
2525
#[error("Failed to decode {line:?} in file {file_name:?} as crate version")]

0 commit comments

Comments
 (0)