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
Unified · Split
| @@ -136,14 +136,20 @@ where · 135 unmodified lines | ||
| 136 | 136 | self.stopped_at = self.delimiters.iter().find(|l| **l == line).cloned(); |
| 137 | 137 | self.peek_buf.clear(); |
| 138 | 138 | return None; |
| 139 | − } else { | |
| 140 | − let len = line | |
| 141 | − .as_slice() | |
| 142 | − .map(|s| s.len() + U16_HEX_BYTES) | |
| 143 | − .unwrap_or(U16_HEX_BYTES); | |
| 144 | − self.peek_buf.resize(len, 0); | |
| 145 | − Ok(Ok(crate::decode(&self.peek_buf).expect("only valid data here"))) | |
| 139 | + } else if self.fail_on_err_lines { | |
| 140 | + if let Some(err) = line.check_error() { | |
| 141 | + self.is_done = true; | |
| 142 | + let err = err.0.as_bstr().to_string(); | |
| 143 | + self.peek_buf.clear(); | |
| 144 | + return Some(Err(io::Error::new(io::ErrorKind::Other, err))); | |
| 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 | 154 | Ok(Err(err)) => { |
| 149 | 155 | self.peek_buf.clear(); |
| @@ -36,6 +36,29 @@ fn peek_follows_read_line_delimiter_logic() -> crate::Result { · 35 unmodified lines | ||
| 36 | 36 | Ok(()) |
| 37 | 37 | } |
| 38 | 38 | |
| 39 | +#[test] | |
| 40 | +fn 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 | 62 | #[test] |
| 40 | 63 | fn peek_non_data() -> crate::Result { |
| 41 | 64 | let mut rd = git_packetline::Provider::new(&b"000000010002"[..], &[PacketLine::ResponseEnd]); |