Skip to content

Commit e179f82

Browse files
committed
feat: replace peel_to_x_in_place by peel_to_x
1 parent a78bf84 commit e179f82

File tree

3 files changed

+74
-19
lines changed

3 files changed

+74
-19
lines changed

gix-ref/src/store/file/raw_ext.rs

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,29 +26,64 @@ pub trait ReferenceExt: Sealed {
2626
///
2727
/// This is useful to learn where this reference is ultimately pointing to after following all symbolic
2828
/// refs and all annotated tags to the first non-tag object.
29+
#[deprecated = "Use `peel_to_id()` instead"]
2930
fn peel_to_id_in_place(
3031
&mut self,
3132
store: &file::Store,
3233
objects: &dyn gix_object::Find,
3334
) -> Result<ObjectId, peel::to_id::Error>;
3435

36+
/// Follow all symbolic targets this reference might point to and peel the underlying object
37+
/// to the end of the tag-chain, returning the first non-tag object the annotated tag points to,
38+
/// using `objects` to access them and `store` to lookup symbolic references.
39+
///
40+
/// This is useful to learn where this reference is ultimately pointing to after following all symbolic
41+
/// refs and all annotated tags to the first non-tag object.
42+
///
43+
/// Note that this method mutates `self` in place if it does not already point to a
44+
/// non-symbolic object.
45+
fn peel_to_id(
46+
&mut self,
47+
store: &file::Store,
48+
objects: &dyn gix_object::Find,
49+
) -> Result<ObjectId, peel::to_id::Error>;
50+
3551
/// Like [`ReferenceExt::peel_to_id_in_place()`], but with support for a known stable `packed` buffer
3652
/// to use for resolving symbolic links.
53+
#[deprecated = "Use `peel_to_id_packed()` instead"]
3754
fn peel_to_id_in_place_packed(
3855
&mut self,
3956
store: &file::Store,
4057
objects: &dyn gix_object::Find,
4158
packed: Option<&packed::Buffer>,
4259
) -> Result<ObjectId, peel::to_id::Error>;
4360

61+
/// Like [`ReferenceExt::peel_to_id_in_place()`], but with support for a known stable `packed` buffer
62+
/// to use for resolving symbolic links.
63+
fn peel_to_id_packed(
64+
&mut self,
65+
store: &file::Store,
66+
objects: &dyn gix_object::Find,
67+
packed: Option<&packed::Buffer>,
68+
) -> Result<ObjectId, peel::to_id::Error>;
69+
4470
/// Like [`ReferenceExt::follow()`], but follows all symbolic references while gracefully handling loops,
4571
/// altering this instance in place.
72+
#[deprecated = "Use `follow_to_object_packed()` instead"]
4673
fn follow_to_object_in_place_packed(
4774
&mut self,
4875
store: &file::Store,
4976
packed: Option<&packed::Buffer>,
5077
) -> Result<ObjectId, peel::to_object::Error>;
5178

79+
/// Like [`ReferenceExt::follow()`], but follows all symbolic references while gracefully handling loops,
80+
/// altering this instance in place.
81+
fn follow_to_object_packed(
82+
&mut self,
83+
store: &file::Store,
84+
packed: Option<&packed::Buffer>,
85+
) -> Result<ObjectId, peel::to_object::Error>;
86+
5287
/// Follow this symbolic reference one level and return the ref it refers to.
5388
///
5489
/// Returns `None` if this is not a symbolic reference, hence the leaf of the chain.
@@ -84,28 +119,45 @@ impl ReferenceExt for Reference {
84119
&mut self,
85120
store: &file::Store,
86121
objects: &dyn gix_object::Find,
122+
) -> Result<ObjectId, peel::to_id::Error> {
123+
self.peel_to_id(store, objects)
124+
}
125+
126+
fn peel_to_id(
127+
&mut self,
128+
store: &file::Store,
129+
objects: &dyn gix_object::Find,
87130
) -> Result<ObjectId, peel::to_id::Error> {
88131
let packed = store.assure_packed_refs_uptodate().map_err(|err| {
89132
peel::to_id::Error::FollowToObject(peel::to_object::Error::Follow(file::find::existing::Error::Find(
90133
file::find::Error::PackedOpen(err),
91134
)))
92135
})?;
93-
self.peel_to_id_in_place_packed(store, objects, packed.as_ref().map(|b| &***b))
136+
self.peel_to_id_packed(store, objects, packed.as_ref().map(|b| &***b))
94137
}
95138

96139
fn peel_to_id_in_place_packed(
97140
&mut self,
98141
store: &file::Store,
99142
objects: &dyn gix_object::Find,
100143
packed: Option<&packed::Buffer>,
144+
) -> Result<ObjectId, peel::to_id::Error> {
145+
self.peel_to_id_packed(store, objects, packed)
146+
}
147+
148+
fn peel_to_id_packed(
149+
&mut self,
150+
store: &file::Store,
151+
objects: &dyn gix_object::Find,
152+
packed: Option<&packed::Buffer>,
101153
) -> Result<ObjectId, peel::to_id::Error> {
102154
match self.peeled {
103155
Some(peeled) => {
104156
self.target = Target::Object(peeled.to_owned());
105157
Ok(peeled)
106158
}
107159
None => {
108-
let mut oid = self.follow_to_object_in_place_packed(store, packed)?;
160+
let mut oid = self.follow_to_object_packed(store, packed)?;
109161
let mut buf = Vec::new();
110162
let peeled_id = loop {
111163
let gix_object::Data { kind, data } =
@@ -138,6 +190,14 @@ impl ReferenceExt for Reference {
138190
&mut self,
139191
store: &file::Store,
140192
packed: Option<&packed::Buffer>,
193+
) -> Result<ObjectId, peel::to_object::Error> {
194+
self.follow_to_object_packed(store, packed)
195+
}
196+
197+
fn follow_to_object_packed(
198+
&mut self,
199+
store: &file::Store,
200+
packed: Option<&packed::Buffer>,
141201
) -> Result<ObjectId, peel::to_object::Error> {
142202
match self.target {
143203
Target::Object(id) => Ok(id),

gix-ref/tests/refs/file/reference.rs

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ mod peel {
8181
let store = store_with_packed_refs()?;
8282
let mut head: Reference = store.find_loose("HEAD")?.into();
8383
let expected = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03");
84-
assert_eq!(head.peel_to_id_in_place(&store, &EmptyCommit)?, expected);
84+
assert_eq!(head.peel_to_id(&store, &EmptyCommit)?, expected);
8585
assert_eq!(head.target.try_id().map(ToOwned::to_owned), Some(expected));
8686

8787
let mut head = store.find("dt1")?;
88-
assert_eq!(head.peel_to_id_in_place(&store, &gix_object::find::Never)?, expected);
88+
assert_eq!(head.peel_to_id(&store, &gix_object::find::Never)?, expected);
8989
assert_eq!(head.target.into_id(), expected);
9090
Ok(())
9191
}
@@ -113,7 +113,7 @@ mod peel {
113113
"but following doesn't do that, only real peeling does"
114114
);
115115

116-
head.peel_to_id_in_place(&store, &EmptyCommit)?;
116+
head.peel_to_id(&store, &EmptyCommit)?;
117117
assert_eq!(
118118
head.target.try_id().map(ToOwned::to_owned),
119119
Some(final_stop),
@@ -135,23 +135,19 @@ mod peel {
135135
assert_eq!(r.kind(), gix_ref::Kind::Symbolic, "there is something to peel");
136136

137137
let commit = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03");
138-
assert_eq!(r.peel_to_id_in_place(&store, &EmptyCommit)?, commit);
138+
assert_eq!(r.peel_to_id(&store, &EmptyCommit)?, commit);
139139
assert_eq!(r.name.as_bstr(), "refs/remotes/origin/multi-link-target3");
140140

141141
let mut r: Reference = store.find_loose("dt1")?.into();
142142
assert_eq!(
143-
r.peel_to_id_in_place(&store, &EmptyCommit)?,
143+
r.peel_to_id(&store, &EmptyCommit)?,
144144
hex_to_id("4c3f4cce493d7beb45012e478021b5f65295e5a3"),
145145
"points to a tag object without actual object lookup"
146146
);
147147

148148
let odb = gix_odb::at(store.git_dir().join("objects"))?;
149149
let mut r: Reference = store.find_loose("dt1")?.into();
150-
assert_eq!(
151-
r.peel_to_id_in_place(&store, &odb)?,
152-
commit,
153-
"points to the commit with lookup"
154-
);
150+
assert_eq!(r.peel_to_id(&store, &odb)?, commit, "points to the commit with lookup");
155151

156152
Ok(())
157153
}
@@ -162,7 +158,7 @@ mod peel {
162158
let store = file::store_at_with_args("make_multi_hop_ref.sh", packed)?;
163159
let odb = gix_odb::at(store.git_dir().join("objects"))?;
164160
let mut r: Reference = store.find("multi-hop")?;
165-
r.peel_to_id_in_place(&store, &odb)?;
161+
r.peel_to_id(&store, &odb)?;
166162

167163
let commit_id = hex_to_id("134385f6d781b7e97062102c6a483440bfda2a03");
168164
assert_eq!(r.peeled, Some(commit_id));
@@ -172,8 +168,7 @@ mod peel {
172168
assert_eq!(obj.kind, gix_object::Kind::Commit, "always peeled to the first non-tag");
173169

174170
let mut r: Reference = store.find("multi-hop")?;
175-
let tag_id =
176-
r.follow_to_object_in_place_packed(&store, store.cached_packed_buffer()?.as_ref().map(|p| &***p))?;
171+
let tag_id = r.follow_to_object_packed(&store, store.cached_packed_buffer()?.as_ref().map(|p| &***p))?;
177172
let obj = odb.find(&tag_id, &mut buf)?;
178173
assert_eq!(obj.kind, gix_object::Kind::Tag, "the first direct object target");
179174
assert_eq!(
@@ -183,7 +178,7 @@ mod peel {
183178
);
184179
let mut r: Reference = store.find("multi-hop2")?;
185180
let other_tag_id =
186-
r.follow_to_object_in_place_packed(&store, store.cached_packed_buffer()?.as_ref().map(|p| &***p))?;
181+
r.follow_to_object_packed(&store, store.cached_packed_buffer()?.as_ref().map(|p| &***p))?;
187182
assert_eq!(other_tag_id, tag_id, "it can follow with multiple hops as well");
188183
}
189184
Ok(())
@@ -197,14 +192,14 @@ mod peel {
197192
assert_eq!(r.name.as_bstr(), "refs/loop-a");
198193

199194
assert!(matches!(
200-
r.peel_to_id_in_place(&store, &gix_object::find::Never).unwrap_err(),
195+
r.peel_to_id(&store, &gix_object::find::Never).unwrap_err(),
201196
gix_ref::peel::to_id::Error::FollowToObject(gix_ref::peel::to_object::Error::Cycle { .. })
202197
));
203198
assert_eq!(r.name.as_bstr(), "refs/loop-a", "the ref is not changed on error");
204199

205200
let mut r: Reference = store.find_loose("loop-a")?.into();
206201
let err = r
207-
.follow_to_object_in_place_packed(&store, store.cached_packed_buffer()?.as_ref().map(|p| &***p))
202+
.follow_to_object_packed(&store, store.cached_packed_buffer()?.as_ref().map(|p| &***p))
208203
.unwrap_err();
209204
assert!(matches!(err, gix_ref::peel::to_object::Error::Cycle { .. }));
210205
Ok(())

gix-ref/tests/refs/file/worktree.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ fn into_peel(
6060
store: &gix_ref::file::Store,
6161
odb: gix_odb::Handle,
6262
) -> impl Fn(gix_ref::Reference) -> gix_hash::ObjectId + '_ {
63-
move |mut r: gix_ref::Reference| r.peel_to_id_in_place(store, &odb).unwrap()
63+
move |mut r: gix_ref::Reference| r.peel_to_id(store, &odb).unwrap()
6464
}
6565

6666
enum Mode {

0 commit comments

Comments
 (0)