Skip to content

Commit 31414e3

Browse files
committed
refactor!: hoist handshake ref handling out of transport code
1 parent 307e3c1 commit 31414e3

File tree

3 files changed

+61
-46
lines changed

3 files changed

+61
-46
lines changed

gitoxide-core/src/pack/receive.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,22 @@ where
8282
})
8383
.collect::<Result<_, _>>()?;
8484
let user_agent = ("agent", Some(agent.clone().into()));
85-
let refmap = gix::protocol::fetch::RefMap::new(
86-
&mut progress,
87-
&mut handshake,
88-
&mut transport.inner,
89-
user_agent.clone(),
90-
trace_packetlines,
91-
gix::protocol::fetch::refmap::init::Options::fetch(fetch_refspecs.clone()),
92-
)
93-
.await?;
85+
86+
let fetch_opts = gix::protocol::fetch::refmap::init::Options::fetch(fetch_refspecs.clone());
87+
let refmap = match handshake.refs.take() {
88+
Some(refs) => gix::protocol::fetch::RefMap::from_refs(refs, &handshake.capabilities, fetch_opts)?,
89+
None => {
90+
gix::protocol::fetch::RefMap::new(
91+
&mut progress,
92+
&handshake.capabilities,
93+
&mut transport.inner,
94+
user_agent.clone(),
95+
trace_packetlines,
96+
fetch_opts,
97+
)
98+
.await?
99+
}
100+
};
94101

95102
if refmap.mappings.is_empty() && !refmap.remote_refs.is_empty() {
96103
return Err(Error::NoMapping {

gix-protocol/src/fetch/refmap/init.rs

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::{
1313
refmap::{Mapping, Source, SpecIndex},
1414
RefMap,
1515
},
16-
handshake::{Outcome, Ref},
16+
handshake::Ref,
1717
};
1818

1919
/// The error returned by [`RefMap::new()`].
@@ -96,7 +96,7 @@ impl RefMap {
9696
#[maybe_async::maybe_async]
9797
pub async fn new<T>(
9898
mut progress: impl Progress,
99-
handshake: &mut Outcome,
99+
capabilities: &Capabilities,
100100
transport: &mut T,
101101
user_agent: (&'static str, Option<Cow<'static, str>>),
102102
trace_packetlines: bool,
@@ -106,28 +106,24 @@ impl RefMap {
106106
T: Transport,
107107
{
108108
let _span = gix_trace::coarse!("gix_protocol::fetch::RefMap::new()");
109-
let remote_refs = match handshake.refs.take() {
110-
Some(refs) => refs,
111-
None => {
112-
crate::ls_refs(
113-
transport,
114-
&handshake.capabilities,
115-
|_capabilities, arguments| {
116-
options.push_prefix_arguments(arguments);
117-
Ok(crate::ls_refs::Action::Continue)
118-
},
119-
&mut progress,
120-
trace_packetlines,
121-
user_agent,
122-
)
123-
.await?
124-
}
125-
};
126-
127-
Self::from_refs(remote_refs, &handshake.capabilities, options)
109+
let remote_refs = crate::ls_refs(
110+
transport,
111+
capabilities,
112+
|_capabilities, arguments| {
113+
options.push_prefix_arguments(arguments);
114+
Ok(crate::ls_refs::Action::Continue)
115+
},
116+
&mut progress,
117+
trace_packetlines,
118+
user_agent,
119+
)
120+
.await?;
121+
122+
Self::from_refs(remote_refs, capabilities, options)
128123
}
129124

130-
fn from_refs(remote_refs: Vec<Ref>, capabilities: &Capabilities, options: Options) -> Result<RefMap, Error> {
125+
/// Create a ref-map from already obtained `remote_refs`.
126+
pub fn from_refs(remote_refs: Vec<Ref>, capabilities: &Capabilities, options: Options) -> Result<RefMap, Error> {
131127
let Options {
132128
fetch_refspecs,
133129
extra_refspecs,

gix/src/remote/connection/ref_map.rs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -150,20 +150,32 @@ where
150150
&mut progress,
151151
)
152152
.await?;
153-
let refmap = gix_protocol::fetch::RefMap::new(
154-
progress,
155-
&mut handshake,
156-
&mut self.transport.inner,
157-
self.remote.repo.config.user_agent_tuple(),
158-
self.trace,
159-
gix_protocol::fetch::refmap::init::Options::new(
160-
self.remote.fetch_specs.clone(),
161-
prefix_from_spec_as_filter_on_remote,
162-
extra_refspecs,
163-
),
164-
)
165-
.await?;
166-
self.handshake = Some(handshake);
167-
Ok(refmap)
153+
154+
let fetch_opts = gix_protocol::fetch::refmap::init::Options::new(
155+
self.remote.fetch_specs.clone(),
156+
prefix_from_spec_as_filter_on_remote,
157+
extra_refspecs,
158+
);
159+
160+
Ok(match handshake.refs.take() {
161+
Some(refs) => {
162+
let refmap = fetch::RefMap::from_refs(refs, &handshake.capabilities, fetch_opts)?;
163+
self.handshake = Some(handshake);
164+
refmap
165+
}
166+
None => {
167+
let refmap = gix_protocol::fetch::RefMap::new(
168+
progress,
169+
&handshake.capabilities,
170+
&mut self.transport.inner,
171+
self.remote.repo.config.user_agent_tuple(),
172+
self.trace,
173+
fetch_opts,
174+
)
175+
.await?;
176+
self.handshake = Some(handshake);
177+
refmap
178+
}
179+
})
168180
}
169181
}

0 commit comments

Comments
 (0)