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
136136 self.stopped_at = self.delimiters.iter().find(|l| **l == line).cloned();
137137 self.peek_buf.clear();
138138 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+ }
146146 }
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")))
147153 }
148154 Ok(Err(err)) => {
149155 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
3636 Ok(())
3737 }
3838
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+
3962 #[test]
4063 fn peek_non_data() -> crate::Result {
4164 let mut rd = git_packetline::Provider::new(&b"000000010002"[..], &[PacketLine::ResponseEnd]);