1 use futures_lite
::io
::AsyncWriteExt
;
2 use gix_transport
::{client, client::TransportV2Ext}
;
4 use crate::{fetch::Arguments, Command}
;
7 /// Send fetch arguments to the server, and indicate this is the end of negotiations only if `add_done_argument` is present.
8 pub async
fn send
<'a
, T
: client
::Transport
+ 'a
>(
11 add_done_argument
: bool
,
12 ) -> Result
<Box
<dyn client
::ExtendedBufRead
+ Unpin
+ 'a
>, client
::Error
> {
13 if self.haves
.is_empty() {
14 assert
!(add_done_argument
, "If there are no haves, is_done must be true.");
17 gix_transport
::Protocol
::V0
| gix_transport
::Protocol
::V1
=> {
18 let (on_into_read
, retained_state
) = self.prepare_v1(
19 transport
.connection_persists_across_multiple_requests(),
23 transport
.request(client
::WriteMode
::OneLfTerminatedLinePerWriteCall
, on_into_read
)?
;
24 let had_args
= !self.args
.is_empty();
25 for arg
in self.args
.drain(..) {
26 line_writer
.write_all(&arg
).await?
;
29 line_writer
.write_message(client
::MessageKind
::Flush
).await?
;
31 for line
in self.haves
.drain(..) {
32 line_writer
.write_all(&line
).await?
;
34 if let Some(next_args
) = retained_state
{
35 self.args
= next_args
;
37 Ok(line_writer
.into_read().await?
)
39 gix_transport
::Protocol
::V2
=> {
40 let retained_state
= self.args
.clone();
41 self.args
.append(&mut self.haves
);
42 if add_done_argument
{
43 self.args
.push("done".into());
47 Command
::Fetch
.as_str(),
48 self.features
.iter().filter(|(_
, v
)| v
.is_some()).cloned(),
49 Some(std
::mem
::replace(&mut self.args
, retained_state
).into_iter()),