History

Assure peek behaves exactly as we want it to with ERR lines

Notes that we only need that complication to support V1. Can't wait for the day when we can drop it. https://github.com/Byron/gitoxide/issues/20

Sebastian Thiel committed 6 years ago

Commit bbdaee51 parent 8bcf5352 files · +36 −7Browse files

Unified · Split

2 files
  1. git-packetline/src/provider/mod.rs +13 −7
  2. git-packetline/tests/packet_line/reader/mod.rs +23 −0
git-packetline/src/provider/mod.rs+13−7
@@ -136,14 +136,20 @@ where · 135 unmodified lines
136 self.stopped_at = self.delimiters.iter().find(|l| **l == line).cloned();136 self.stopped_at = self.delimiters.iter().find(|l| **l == line).cloned();
137 self.peek_buf.clear();137 self.peek_buf.clear();
138 return None;138 return None;
139 } else {139 } else if self.fail_on_err_lines {
140 let len = line140 if let Some(err) = line.check_error() {
141 .as_slice()141 self.is_done = true;
142 .map(|s| s.len() + U16_HEX_BYTES)142 let err = err.0.as_bstr().to_string();
143 .unwrap_or(U16_HEX_BYTES);143 self.peek_buf.clear();
144 self.peek_buf.resize(len, 0);144 return Some(Err(io::Error::new(io::ErrorKind::Other, err)));
145 Ok(Ok(crate::decode(&self.peek_buf).expect("only valid data here")))145 }
146 }146 }
147 let len = line
148 .as_slice()
149 .map(|s| s.len() + U16_HEX_BYTES)
150 .unwrap_or(U16_HEX_BYTES);
151 self.peek_buf.resize(len, 0);
152 Ok(Ok(crate::decode(&self.peek_buf).expect("only valid data here")))
147 }153 }
148 Ok(Err(err)) => {154 Ok(Err(err)) => {
149 self.peek_buf.clear();155 self.peek_buf.clear();
git-packetline/tests/packet_line/reader/mod.rs+23−0
@@ -36,6 +36,29 @@ fn peek_follows_read_line_delimiter_logic() -> crate::Result { · 35 unmodified lines
36 Ok(())36 Ok(())
37}37}
38 38
39#[test]
40fn peek_follows_read_line_err_logic() -> crate::Result {
41 let mut rd = git_packetline::Provider::new(&b"0005a0009ERR e0000"[..], &[PacketLine::Flush]);
42 rd.fail_on_err_lines(true);
43 assert_eq!(rd.peek_line().expect("line")??, PacketLine::Data(b"a"));
44 rd.read_line();
45 assert_eq!(
46 rd.peek_line().expect("line").unwrap_err().to_string(),
47 "e",
48 "io errors are used to communicate remote errors when peeking"
49 );
50 assert!(rd.peek_line().is_none(), "we are still done, no way around it");
51 assert_eq!(rd.stopped_at(), None, "we stopped not because of a delimiter");
52 rd.reset();
53 assert!(rd.peek_line().is_none(), "it should stop due to the delimiter");
54 assert_eq!(
55 rd.stopped_at(),
56 Some(PacketLine::Flush),
57 "Stopped tracking is done even when peeking"
58 );
59 Ok(())
60}
61
39#[test]62#[test]
40fn peek_non_data() -> crate::Result {63fn peek_non_data() -> crate::Result {
41 let mut rd = git_packetline::Provider::new(&b"000000010002"[..], &[PacketLine::ResponseEnd]);64 let mut rd = git_packetline::Provider::new(&b"000000010002"[..], &[PacketLine::ResponseEnd]);