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 | 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 = line | 140 | 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(); |
| @@ -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] | ||
| 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 | #[test] | 62 | #[test] |
| 40 | fn peek_non_data() -> crate::Result { | 63 | fn 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]); |