History

[clone] When unpacking peeled refs, use the object that refers to the tag…

…and not the one that refers to the (usually) commit the tags points to. When declaring wants, it really wants to see tips first, it appears. Quite tricky

Sebastian Thiel committed 6 years ago

Commit fe8bb391 parent 7c8ecb73 files · +6 −4Browse files

Unified · Split

3 files
  1. git-protocol/src/fetch/refs.rs +4 −2
  2. git-protocol/tests/fetch/mod.rs +1 −1
  3. gitoxide-core/src/pack/receive.rs +1 −1
git-protocol/src/fetch/refs.rs+4−2
@@ -54,10 +54,12 @@ pub enum Ref { · 53 unmodified lines
54}54}
55 55
56impl Ref {56impl Ref {
57 pub fn unpack_common(&self) -> (&BString, &owned::Id) {57 /// Provide shared fields referring to the ref itself. In case of peeled refs, the tag object itself is returned as it is what
58 /// the path refers to.
59 pub fn unpack(&self) -> (&BString, &owned::Id) {
58 match self {60 match self {
59 Ref::Direct { path, object, .. }61 Ref::Direct { path, object, .. }
60 | Ref::Peeled { path, object, .. }62 | Ref::Peeled { path, tag: object, .. } // the tag acts as reference
61 | Ref::Symbolic { path, object, .. } => (path, object),63 | Ref::Symbolic { path, object, .. } => (path, object),
62 }64 }
63 }65 }
git-protocol/tests/fetch/mod.rs+1−1
@@ -16,7 +16,7 @@ struct CloneDelegate { · 15 unmodified lines
16impl fetch::Delegate for CloneDelegate {16impl fetch::Delegate for CloneDelegate {
17 fn negotiate(&mut self, refs: &[Ref], arguments: &mut Arguments, _previous_result: Option<&Response>) -> Action {17 fn negotiate(&mut self, refs: &[Ref], arguments: &mut Arguments, _previous_result: Option<&Response>) -> Action {
18 for r in refs {18 for r in refs {
19 arguments.want(r.unpack_common().1.to_borrowed());19 arguments.want(r.unpack().1.to_borrowed());
20 }20 }
21 Action::Close21 Action::Close
22 }22 }
gitoxide-core/src/pack/receive.rs+1−1
@@ -20,7 +20,7 @@ struct CloneDelegate<W: io::Write> { · 19 unmodified lines
20impl<W: io::Write> git_protocol::fetch::Delegate for CloneDelegate<W> {20impl<W: io::Write> git_protocol::fetch::Delegate for CloneDelegate<W> {
21 fn negotiate(&mut self, refs: &[Ref], arguments: &mut Arguments, _previous: Option<&Response>) -> Action {21 fn negotiate(&mut self, refs: &[Ref], arguments: &mut Arguments, _previous: Option<&Response>) -> Action {
22 for r in refs {22 for r in refs {
23 arguments.want(r.unpack_common().1.to_borrowed());23 arguments.want(r.unpack().1.to_borrowed());
24 }24 }
25 Action::Close25 Action::Close
26 }26 }