History

refactor

Sebastian Thiel committed 6 years ago

Commit bbce3401 parent 73a68682 files · +57 −43Browse files

Unified · Split

2 files
  1. git-transport/src/client/git.rs +53 −39
  2. git-transport/tests/client/git.rs +4 −4
git-transport/src/client/git.rs+53−39
@@ -1,5 +1,5 @@
1use crate::{client::SetServiceResponse, Protocol, Service};1use crate::{client::SetServiceResponse, Protocol, Service};
2use bstr::{BString, ByteVec};2use bstr::BString;
3use std::{io, net::TcpStream};3use std::{io, net::TcpStream};
4 4
5pub struct Connection<R, W> {5pub struct Connection<R, W> {
@@ -17,31 +17,58 @@ where · 11 unmodified lines
17{17{
18}18}
19 19
20pub fn connect_message(20pub mod message {
21 service: Service,21 use crate::{Protocol, Service};
22 version: Protocol,22 use bstr::{BString, ByteVec};
23 path: &[u8],23
24 virtual_host: Option<&(String, Option<u16>)>,24 pub fn connect(
25) -> BString {25 service: Service,
26 let mut out = bstr::BString::from(service.as_str());26 version: Protocol,
27 out.push(b' ');27 path: &[u8],
28 out.extend_from_slice(&path);28 virtual_host: Option<&(String, Option<u16>)>,
29 out.push(0);29 ) -> BString {
30 if let Some((host, port)) = virtual_host {30 let mut out = bstr::BString::from(service.as_str());
31 out.push_str("host=");31 out.push(b' ');
32 out.extend_from_slice(host.as_bytes());32 out.extend_from_slice(&path);
33 if let Some(port) = port {
34 out.push_byte(b':');
35 out.push_str(&format!("{}", port));
36 }
37 out.push(0);33 out.push(0);
34 if let Some((host, port)) = virtual_host {
35 out.push_str("host=");
36 out.extend_from_slice(host.as_bytes());
37 if let Some(port) = port {
38 out.push_byte(b':');
39 out.push_str(&format!("{}", port));
40 }
41 out.push(0);
42 }
43 if version != Protocol::V1 {
44 out.push(0);
45 out.push_str(format!("version={}", version as usize));
46 out.push(0);
47 }
48 out
38 }49 }
39 if version != Protocol::V1 {50}
40 out.push(0);51
41 out.push_str(format!("version={}", version as usize));52pub(crate) mod recv {
42 out.push(0);53 use crate::client::Capabilities;
54 use std::io;
55
56 pub fn capabilties_and_possibly_refs<'a, T: io::Read>(
57 rd: &'a mut git_packetline::Reader<T>,
58 ) -> Result<(Capabilities, Option<Box<dyn io::BufRead + 'a>>), crate::client::Error> {
59 rd.fail_on_err_lines(true);
60 let capabilities = rd
61 .peek_line()
62 .ok_or(crate::client::Error::ExpectedLine("capabilities or version"))???;
63 let (capabilities, delimiter_position) = Capabilities::from_bytes(
64 capabilities
65 .to_text()
66 .ok_or(crate::client::Error::ExpectedDataLine)?
67 .as_slice(),
68 )?;
69 rd.peek_buffer_replace_and_truncate(delimiter_position, b'\n');
70 Ok((capabilities, Some(Box::new(rd.as_read()))))
43 }71 }
44 out
45}72}
46 73
47impl<R, W> crate::client::TransportSketch for Connection<R, W>74impl<R, W> crate::client::TransportSketch for Connection<R, W>
@@ -50,7 +77,7 @@ where · 2 unmodified lines
50 W: io::Write,77 W: io::Write,
51{78{
52 fn set_service(&mut self, service: Service) -> Result<SetServiceResponse, crate::client::Error> {79 fn set_service(&mut self, service: Service) -> Result<SetServiceResponse, crate::client::Error> {
53 self.write.write_all(&connect_message(80 self.write.write_all(&message::connect(
54 service,81 service,
55 self.protocol,82 self.protocol,
56 &self.path,83 &self.path,
@@ -58,23 +85,11 @@ where · 1 unmodified line
58 ))?;85 ))?;
59 self.write.flush()?;86 self.write.flush()?;
60 87
61 self.line_reader.fail_on_err_lines(true);88 let (capabilities, refs) = recv::capabilties_and_possibly_refs(&mut self.line_reader)?;
62 let capabilities = self
63 .line_reader
64 .peek_line()
65 .ok_or(crate::client::Error::ExpectedLine("capabilities or version"))???;
66 let (capabilities, delimiter_position) = Capabilities::from_bytes(
67 capabilities
68 .to_text()
69 .ok_or(crate::client::Error::ExpectedDataLine)?
70 .as_slice(),
71 )?;
72 self.line_reader
73 .peek_buffer_replace_and_truncate(delimiter_position, b'\n');
74 Ok(SetServiceResponse {89 Ok(SetServiceResponse {
75 actual_protocol: Protocol::V1, // TODO - read actual only if we are in version two or above90 actual_protocol: Protocol::V1, // TODO - read actual only if we are in version two or above
76 capabilities,91 capabilities,
77 refs: Some(Box::new(self.line_reader.as_read())),92 refs,
78 })93 })
79 }94 }
80}95}
@@ -101,7 +116,6 @@ where · 20 unmodified lines
101 }116 }
102}117}
103 118
104use crate::client::Capabilities;
105use quick_error::quick_error;119use quick_error::quick_error;
106quick_error! {120quick_error! {
107 #[derive(Debug)]121 #[derive(Debug)]
git-transport/tests/client/git.rs+4−4
@@ -4,21 +4,21 @@ mod connect_message { · 3 unmodified lines
4 #[test]4 #[test]
5 fn version_1_without_host_and_version() {5 fn version_1_without_host_and_version() {
6 assert_eq!(6 assert_eq!(
7 git::connect_message(Service::UploadPack, Protocol::V1, b"hello/world", None),7 git::message::connect(Service::UploadPack, Protocol::V1, b"hello/world", None),
8 "git-upload-pack hello/world\0"8 "git-upload-pack hello/world\0"
9 )9 )
10 }10 }
11 #[test]11 #[test]
12 fn version_2_without_host_and_version() {12 fn version_2_without_host_and_version() {
13 assert_eq!(13 assert_eq!(
14 git::connect_message(Service::UploadPack, Protocol::V2, b"hello\\world", None),14 git::message::connect(Service::UploadPack, Protocol::V2, b"hello\\world", None),
15 "git-upload-pack hello\\world\0\0version=2\0"15 "git-upload-pack hello\\world\0\0version=2\0"
16 )16 )
17 }17 }
18 #[test]18 #[test]
19 fn with_host_without_port() {19 fn with_host_without_port() {
20 assert_eq!(20 assert_eq!(
21 git::connect_message(21 git::message::connect(
22 Service::UploadPack,22 Service::UploadPack,
23 Protocol::V1,23 Protocol::V1,
24 b"hello\\world",24 b"hello\\world",
@@ -30,7 +30,7 @@ mod connect_message { · 5 unmodified lines
30 #[test]30 #[test]
31 fn with_host_with_port() {31 fn with_host_with_port() {
32 assert_eq!(32 assert_eq!(
33 git::connect_message(33 git::message::connect(
34 Service::UploadPack,34 Service::UploadPack,
35 Protocol::V1,35 Protocol::V1,
36 b"hello\\world",36 b"hello\\world",