| @@ -151,8 +151,7 @@ impl Arguments { · 150 unmodified lines |
| 151 | 151 | mod shared { |
| 152 | 152 | use crate::fetch::Arguments; |
| 153 | 153 | use bstr::{BString, ByteSlice}; |
| 154 | | − use git_transport::client; |
| 155 | | − use git_transport::client::MessageKind; |
| 154 | + use git_transport::{client, client::MessageKind}; |
| 156 | 155 | |
| 157 | 156 | impl Arguments { |
| 158 | 157 | pub(in crate::fetch::arguments) fn send_shared_v1( |
| @@ -183,109 +182,7 @@ mod shared { · 24 unmodified lines |
| 183 | 182 | } |
| 184 | 183 | |
| 185 | 184 | #[cfg(all(not(feature = "blocking-client"), feature = "async-client"))] |
| 186 | | −mod async_io { |
| 187 | | − use crate::fetch::{Arguments, Command}; |
| 188 | | − use futures_lite::io::AsyncWriteExt; |
| 189 | | − use git_transport::{client, client::TransportV2Ext}; |
| 190 | | − |
| 191 | | − impl Arguments { |
| 192 | | − pub(crate) async fn send<'a, T: client::Transport + Send + 'a>( |
| 193 | | − &mut self, |
| 194 | | − transport: &'a mut T, |
| 195 | | − add_done_argument: bool, |
| 196 | | − ) -> Result<Box<dyn client::ExtendedBufRead + Unpin + 'a>, client::Error> { |
| 197 | | − if self.haves.is_empty() { |
| 198 | | − assert!(add_done_argument, "If there are no haves, is_done must be true."); |
| 199 | | − } |
| 200 | | − match self.version { |
| 201 | | − git_transport::Protocol::V1 => { |
| 202 | | − let (on_into_read, retained_state) = |
| 203 | | − self.send_shared_v1(transport.is_stateful(), add_done_argument)?; |
| 204 | | − let mut line_writer = |
| 205 | | − transport.request(client::WriteMode::OneLfTerminatedLinePerWriteCall, on_into_read)?; |
| 206 | | − let had_args = !self.args.is_empty(); |
| 207 | | − for arg in self.args.drain(..) { |
| 208 | | − line_writer.write_all(&arg).await?; |
| 209 | | − } |
| 210 | | − if had_args { |
| 211 | | − line_writer.write_message(client::MessageKind::Flush).await?; |
| 212 | | − } |
| 213 | | − for line in self.haves.drain(..) { |
| 214 | | − line_writer.write_all(&line).await?; |
| 215 | | − } |
| 216 | | − if let Some(next_args) = retained_state { |
| 217 | | − self.args = next_args; |
| 218 | | − } |
| 219 | | − Ok(line_writer.into_read().await?) |
| 220 | | − } |
| 221 | | − git_transport::Protocol::V2 => { |
| 222 | | − let retained_state = self.args.clone(); |
| 223 | | − self.args.extend(self.haves.drain(..)); |
| 224 | | − if add_done_argument { |
| 225 | | − self.args.push("done".into()); |
| 226 | | − } |
| 227 | | − transport |
| 228 | | − .invoke( |
| 229 | | − Command::Fetch.as_str(), |
| 230 | | − self.features.iter().filter(|(_, v)| v.is_some()).cloned(), |
| 231 | | − Some(std::mem::replace(&mut self.args, retained_state).into_iter()), |
| 232 | | − ) |
| 233 | | − .await |
| 234 | | − } |
| 235 | | − } |
| 236 | | − } |
| 237 | | − } |
| 238 | | −} |
| 185 | +mod async_io; |
| 239 | 186 | |
| 240 | 187 | #[cfg(feature = "blocking-client")] |
| 241 | | −mod blocking_io { |
| 242 | | − use crate::fetch::{Arguments, Command}; |
| 243 | | − use git_transport::{client, client::TransportV2Ext}; |
| 244 | | − use std::io::Write; |
| 245 | | − |
| 246 | | − impl Arguments { |
| 247 | | − pub(crate) fn send<'a, T: client::Transport + 'a>( |
| 248 | | − &mut self, |
| 249 | | − transport: &'a mut T, |
| 250 | | − add_done_argument: bool, |
| 251 | | − ) -> Result<Box<dyn client::ExtendedBufRead + 'a>, client::Error> { |
| 252 | | − if self.haves.is_empty() { |
| 253 | | − assert!(add_done_argument, "If there are no haves, is_done must be true."); |
| 254 | | − } |
| 255 | | − match self.version { |
| 256 | | − git_transport::Protocol::V1 => { |
| 257 | | − let (on_into_read, retained_state) = |
| 258 | | − self.send_shared_v1(transport.is_stateful(), add_done_argument)?; |
| 259 | | − let mut line_writer = |
| 260 | | − transport.request(client::WriteMode::OneLfTerminatedLinePerWriteCall, on_into_read)?; |
| 261 | | − let had_args = !self.args.is_empty(); |
| 262 | | − for arg in self.args.drain(..) { |
| 263 | | − line_writer.write_all(&arg)?; |
| 264 | | − } |
| 265 | | − if had_args { |
| 266 | | − line_writer.write_message(client::MessageKind::Flush)?; |
| 267 | | − } |
| 268 | | − for line in self.haves.drain(..) { |
| 269 | | − line_writer.write_all(&line)?; |
| 270 | | − } |
| 271 | | − if let Some(next_args) = retained_state { |
| 272 | | − self.args = next_args; |
| 273 | | − } |
| 274 | | − Ok(line_writer.into_read()?) |
| 275 | | − } |
| 276 | | − git_transport::Protocol::V2 => { |
| 277 | | − let retained_state = self.args.clone(); |
| 278 | | − self.args.extend(self.haves.drain(..)); |
| 279 | | − if add_done_argument { |
| 280 | | − self.args.push("done".into()); |
| 281 | | − } |
| 282 | | − transport.invoke( |
| 283 | | − Command::Fetch.as_str(), |
| 284 | | − self.features.iter().filter(|(_, v)| v.is_some()).cloned(), |
| 285 | | − Some(std::mem::replace(&mut self.args, retained_state).into_iter()), |
| 286 | | − ) |
| 287 | | − } |
| 288 | | − } |
| 289 | | − } |
| 290 | | − } |
| 291 | | −} |
| 188 | +mod blocking_io; |