Skip to content

Commit aeb6f45

Browse files
committed
refactor (#16)
1 parent 6dadfb7 commit aeb6f45

File tree

2 files changed

+93
-93
lines changed

2 files changed

+93
-93
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
use crate::index::index_ro;
2+
use crates_index_diff::{Change, CrateVersion, Index};
3+
use git_repository as git;
4+
use git_repository::prelude::ObjectIdExt;
5+
6+
#[test]
7+
fn addition() -> crate::Result {
8+
let changes = changes(&index_ro()?, ":/initial commit")?;
9+
assert_eq!(changes.len(), 3228);
10+
assert!(matches!(
11+
changes
12+
.first()
13+
.and_then(|c| c.added().map(|v| v.name.as_str())),
14+
Some("gi-get-artifact")
15+
));
16+
assert!(matches!(
17+
changes.last().expect("present"),
18+
Change::Added(CrateVersion {name, ..}) if name == "gizmo"
19+
));
20+
Ok(())
21+
}
22+
23+
#[test]
24+
fn deletion() -> crate::Result {
25+
let changes = changes(&index_ro()?, "@~326")?;
26+
assert_eq!(changes.len(), 1);
27+
assert_eq!(changes.first().and_then(|c| c.deleted()), Some("girl"));
28+
Ok(())
29+
}
30+
31+
#[test]
32+
fn new_version() -> crate::Result {
33+
let changes = changes(&index_ro()?, ":/Updating crate `git-repository#0.22.1`")?;
34+
assert_eq!(changes.len(), 1);
35+
assert_eq!(
36+
changes
37+
.first()
38+
.and_then(|c| c.added().map(|v| v.name.as_str())),
39+
Some("git-repository")
40+
);
41+
Ok(())
42+
}
43+
44+
#[test]
45+
fn yanked() -> crate::Result {
46+
let changes = changes(&index_ro()?, ":/Yanking crate `github_release_rs#0.1.0`")?;
47+
assert_eq!(changes.len(), 1);
48+
assert_eq!(
49+
changes
50+
.first()
51+
.and_then(|c| c.yanked().map(|v| v.name.as_str())),
52+
Some("github_release_rs")
53+
);
54+
Ok(())
55+
}
56+
57+
#[test]
58+
fn normalization() -> crate::Result {
59+
let changes = changes(&index_ro()?, ":/normalize")?;
60+
assert_eq!(
61+
changes.len(),
62+
2356, // should be 0
63+
"normalization changes the representation, but the data itself stays the same, BUT we can't do it yet"
64+
);
65+
Ok(())
66+
}
67+
68+
fn changes(index: &Index, revspec: &str) -> crate::Result<Vec<Change>> {
69+
let repo = git::open(index.repository().path())?;
70+
let commit = repo.rev_parse(revspec)?.single().unwrap();
71+
let ancestor_tree = commit
72+
.object()?
73+
.into_commit()
74+
.parent_ids()
75+
.next()
76+
.and_then(|parent| parent.object().ok()?.into_commit().tree_id().ok())
77+
.unwrap_or_else(|| git::hash::ObjectId::empty_tree(repo.object_hash()).attach(&repo));
78+
Ok(index.changes_from_objects(
79+
&index
80+
.repository()
81+
.find_object(object_id_to_oid(ancestor_tree), None)
82+
.expect("ancestor tree is available"),
83+
&index
84+
.repository()
85+
.find_object(object_id_to_oid(commit), None)
86+
.expect("first object exists"),
87+
)?)
88+
}
89+
90+
fn object_id_to_oid(oid: impl Into<git::ObjectId>) -> git2::Oid {
91+
git2::Oid::from_bytes(oid.into().as_bytes()).expect("valid")
92+
}

tests/index/mod.rs

Lines changed: 1 addition & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,7 @@
11
use crates_index_diff::Index;
22

3+
mod changes_from_objects;
34
mod old;
4-
mod changes_from_objects {
5-
use crate::index::index_ro;
6-
use crates_index_diff::{Change, CrateVersion, Index};
7-
use git_repository as git;
8-
use git_repository::prelude::ObjectIdExt;
9-
10-
#[test]
11-
fn addition() -> crate::Result {
12-
let changes = changes(&index_ro()?, ":/initial commit")?;
13-
assert_eq!(changes.len(), 3228);
14-
assert!(matches!(
15-
changes
16-
.first()
17-
.and_then(|c| c.added().map(|v| v.name.as_str())),
18-
Some("gi-get-artifact")
19-
));
20-
assert!(matches!(
21-
changes.last().expect("present"),
22-
Change::Added(CrateVersion {name, ..}) if name == "gizmo"
23-
));
24-
Ok(())
25-
}
26-
#[test]
27-
fn deletion() -> crate::Result {
28-
let changes = changes(&index_ro()?, "@~326")?;
29-
assert_eq!(changes.len(), 1);
30-
assert_eq!(changes.first().and_then(|c| c.deleted()), Some("girl"));
31-
Ok(())
32-
}
33-
34-
#[test]
35-
fn new_version() -> crate::Result {
36-
let changes = changes(&index_ro()?, ":/Updating crate `git-repository#0.22.1`")?;
37-
assert_eq!(changes.len(), 1);
38-
assert_eq!(
39-
changes
40-
.first()
41-
.and_then(|c| c.added().map(|v| v.name.as_str())),
42-
Some("git-repository")
43-
);
44-
Ok(())
45-
}
46-
47-
#[test]
48-
fn yanked() -> crate::Result {
49-
let changes = changes(&index_ro()?, ":/Yanking crate `github_release_rs#0.1.0`")?;
50-
assert_eq!(changes.len(), 1);
51-
assert_eq!(
52-
changes
53-
.first()
54-
.and_then(|c| c.yanked().map(|v| v.name.as_str())),
55-
Some("github_release_rs")
56-
);
57-
Ok(())
58-
}
59-
60-
#[test]
61-
fn normalization() -> crate::Result {
62-
let changes = changes(&index_ro()?, ":/normalize")?;
63-
assert_eq!(
64-
changes.len(),
65-
2356, // should be 0
66-
"normalization changes the representation, but the data itself stays the same, BUT we can't do it yet"
67-
);
68-
Ok(())
69-
}
70-
71-
fn changes(index: &Index, revspec: &str) -> crate::Result<Vec<Change>> {
72-
let repo = git::open(index.repository().path())?;
73-
let commit = repo.rev_parse(revspec)?.single().unwrap();
74-
let ancestor_tree = commit
75-
.object()?
76-
.into_commit()
77-
.parent_ids()
78-
.next()
79-
.and_then(|parent| parent.object().ok()?.into_commit().tree_id().ok())
80-
.unwrap_or_else(|| git::hash::ObjectId::empty_tree(repo.object_hash()).attach(&repo));
81-
Ok(index.changes_from_objects(
82-
&index
83-
.repository()
84-
.find_object(object_id_to_oid(ancestor_tree), None)
85-
.expect("ancestor tree is available"),
86-
&index
87-
.repository()
88-
.find_object(object_id_to_oid(commit), None)
89-
.expect("first object exists"),
90-
)?)
91-
}
92-
93-
fn object_id_to_oid(oid: impl Into<git::ObjectId>) -> git2::Oid {
94-
git2::Oid::from_bytes(oid.into().as_bytes()).expect("valid")
95-
}
96-
}
975

986
fn index_ro() -> crate::Result<Index> {
997
let dir = git_testtools::scripted_fixture_repo_read_only_with_args(

0 commit comments

Comments
 (0)