Skip to content

Commit b538ad6

Browse files
committed
change!: Change::Deleted variant now as versions to include all deleted versions. (#26)
That way it doesn't degenerate any information, previously the exact version information was lost. Not doing so helps to be able to reproduce the current state by aggregating all changes.
1 parent f9be536 commit b538ad6

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

src/index/diff/delegate.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::ops::Range;
88
#[derive(Default)]
99
pub(crate) struct Delegate {
1010
changes: Vec<Change>,
11-
delete_version_ids: BTreeSet<u64>,
11+
deleted_version_ids: BTreeSet<u64>,
1212
err: Option<Error>,
1313
}
1414

@@ -45,10 +45,16 @@ impl Delegate {
4545
}
4646
}
4747
}
48-
Deletion { entry_mode, .. } => {
48+
Deletion { entry_mode, id, .. } => {
4949
if entry_mode.is_no_tree() {
50+
let obj = id.object()?;
51+
let mut deleted = Vec::with_capacity(obj.data.lines().count());
52+
for line in obj.data.lines() {
53+
deleted.push(version_from_json_line(line.into(), change.location)?);
54+
}
5055
self.changes.push(Change::Deleted {
5156
name: change.location.to_string(),
57+
versions: deleted,
5258
});
5359
}
5460
}
@@ -89,7 +95,7 @@ impl Delegate {
8995
for removed in lines_before {
9096
match version_from_json_line(removed, location) {
9197
Ok(version) => {
92-
self.delete_version_ids.insert(version.id());
98+
self.deleted_version_ids.insert(version.id());
9399
}
94100
Err(e) => {
95101
err = Some(e);
@@ -152,8 +158,8 @@ impl Delegate {
152158
match self.err {
153159
Some(err) => Err(err),
154160
None => {
155-
if !self.delete_version_ids.is_empty() {
156-
let deleted_version_ids = &self.delete_version_ids;
161+
if !self.deleted_version_ids.is_empty() {
162+
let deleted_version_ids = &self.deleted_version_ids;
157163
self.changes.retain(|change| match change {
158164
Change::Added(v) | Change::Yanked(v) => {
159165
!deleted_version_ids.contains(&v.id())

src/types.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ pub enum Change {
2626
Added(CrateVersion),
2727
/// A crate version was yanked.
2828
Yanked(CrateVersion),
29-
/// The name of the deleted crate, which implies all versions were deleted as well.
29+
/// The name of the crate whose file was deleted, which implies all versions were deleted as well.
3030
Deleted {
3131
/// The name of the deleted crate.
3232
name: String,
33+
/// All of its versions that were deleted along with the file.
34+
versions: Vec<CrateVersion>,
3335
},
3436
}
3537

@@ -51,9 +53,9 @@ impl Change {
5153
}
5254

5355
/// Return the deleted crate, if this is this kind of change.
54-
pub fn deleted(&self) -> Option<&str> {
56+
pub fn deleted(&self) -> Option<(&str, &[CrateVersion])> {
5557
match self {
56-
Change::Deleted { name } => Some(name.as_str()),
58+
Change::Deleted { name, versions } => Some((name.as_str(), versions)),
5759
_ => None,
5860
}
5961
}

tests/index/changes_between_commits.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use git_repository as git;
66
fn directory_deletions_are_not_picked_up() -> crate::Result {
77
let changes = changes(index_ro()?, ":/reproduce issue #20")?;
88
assert_eq!(changes.len(), 1);
9-
assert_eq!(changes.first().and_then(|c| c.deleted()), Some("allowed"));
9+
assert_eq!(
10+
changes.first().and_then(|c| c.deleted().map(|t| t.0)),
11+
Some("allowed")
12+
);
1013
Ok(())
1114
}
1215

@@ -47,7 +50,10 @@ fn addition() -> crate::Result {
4750
fn deletion() -> crate::Result {
4851
let changes = changes(index_ro()?, "@^{/Delete crates}")?;
4952
assert_eq!(changes.len(), 1);
50-
assert_eq!(changes.first().and_then(|c| c.deleted()), Some("girl"));
53+
assert_eq!(
54+
changes.first().and_then(|c| c.deleted().map(|t| t.0)),
55+
Some("girl")
56+
);
5157
Ok(())
5258
}
5359

0 commit comments

Comments
 (0)