Skip to content

Commit 3416414

Browse files
committed
handle modifications and yanks (#16)
1 parent eadc65f commit 3416414

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/index/diff.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use git_repository::bstr::BStr;
44
use git_repository::diff::tree::visit::Action;
55
use git_repository::prelude::{FindExt, ObjectIdExt, TreeIterExt};
66
use git_repository::refs::transaction::PreviousValue;
7+
use similar::ChangeTag;
78
use std::convert::TryFrom;
89

910
static LINE_ADDED_INDICATOR: char = '+';
@@ -209,11 +210,8 @@ impl Index {
209210
Addition { entry_mode, oid } => {
210211
if let Some(obj) = entry_data(self.repo, entry_mode, oid)? {
211212
for line in (&obj.data).lines() {
212-
self.changes.push(Change::Added(serde_json::from_slice::<
213-
CrateVersion,
214-
>(
215-
line
216-
)?));
213+
self.changes
214+
.push(Change::Added(serde_json::from_slice(line)?));
217215
}
218216
}
219217
}
@@ -230,8 +228,25 @@ impl Index {
230228
} => {
231229
let pair = entry_data(self.repo, previous_entry_mode, previous_oid)?
232230
.zip(entry_data(self.repo, entry_mode, oid)?);
233-
if let Some((_prev, _new)) = pair {
234-
todo!("modification")
231+
if let Some((old, new)) = pair {
232+
let diff = similar::TextDiffConfig::default()
233+
.algorithm(similar::Algorithm::Myers)
234+
.diff_lines(old.data.as_slice(), new.data.as_slice());
235+
for change in diff.iter_all_changes() {
236+
match change.tag() {
237+
ChangeTag::Delete => todo!("deletion"),
238+
ChangeTag::Insert => {
239+
let version =
240+
serde_json::from_slice::<CrateVersion>(change.value())?;
241+
self.changes.push(if version.yanked {
242+
Change::Yanked(version)
243+
} else {
244+
Change::Added(version)
245+
});
246+
}
247+
ChangeTag::Equal => {}
248+
}
249+
}
235250
}
236251
}
237252
}

tests/index/changes_between_commits.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ fn new_version() -> crate::Result {
6767
}
6868

6969
#[test]
70-
#[ignore]
7170
fn new_version2() -> crate::Result {
7271
let changes = changes2(index_ro()?, ":/Updating crate `git-repository#0.22.1`")?;
7372
assert_eq!(changes.len(), 1);

0 commit comments

Comments
 (0)