Skip to content

Commit 0eecfab

Browse files
committed
adapt to changes in gix-transport and add V2 test for unshallow fetching
1 parent 72ec01b commit 0eecfab

File tree

6 files changed

+103
-10
lines changed

6 files changed

+103
-10
lines changed

gix-protocol/src/fetch/response/async_io.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::io;
22

3-
use futures_lite::AsyncBufReadExt;
43
use gix_transport::{client, Protocol};
54

65
use crate::fetch::{
@@ -16,7 +15,7 @@ async fn parse_v2_section<T>(
1615
parse: impl Fn(&str) -> Result<T, response::Error>,
1716
) -> Result<bool, response::Error> {
1817
line.clear();
19-
while reader.read_line(line).await? != 0 {
18+
while reader.readline_str(line).await? != 0 {
2019
res.push(parse(line)?);
2120
line.clear();
2221
}
@@ -62,7 +61,7 @@ impl Response {
6261
Some(client::MessageKind::Flush),
6362
"If this isn't a flush packet, we don't know what's going on"
6463
);
65-
reader.read_line(&mut line).await?;
64+
reader.readline_str(&mut line).await?;
6665
reader.reset(Protocol::V1);
6766
match reader.peek_data_line().await {
6867
Some(Ok(Ok(line))) => String::from_utf8_lossy(line),
@@ -76,7 +75,11 @@ impl Response {
7675
if Response::parse_v1_ack_or_shallow_or_assume_pack(&mut acks, &mut shallows, &peeked_line) {
7776
break 'lines true;
7877
}
79-
assert_ne!(reader.read_line(&mut line).await?, 0, "consuming a peeked line works");
78+
assert_ne!(
79+
reader.readline_str(&mut line).await?,
80+
0,
81+
"consuming a peeked line works"
82+
);
8083
};
8184
Ok(Response {
8285
acks,
@@ -94,7 +97,7 @@ impl Response {
9497
let mut wanted_refs = Vec::<WantedRef>::new();
9598
let has_pack = 'section: loop {
9699
line.clear();
97-
if reader.read_line(&mut line).await? == 0 {
100+
if reader.readline_str(&mut line).await? == 0 {
98101
return Err(response::Error::Io(io::Error::new(
99102
io::ErrorKind::UnexpectedEof,
100103
"Could not read message headline",

gix-protocol/src/fetch/response/blocking_io.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn parse_v2_section<T>(
1515
parse: impl Fn(&str) -> Result<T, response::Error>,
1616
) -> Result<bool, response::Error> {
1717
line.clear();
18-
while reader.read_line(line)? != 0 {
18+
while reader.readline_str(line)? != 0 {
1919
res.push(parse(line)?);
2020
line.clear();
2121
}
@@ -61,7 +61,7 @@ impl Response {
6161
Some(client::MessageKind::Flush),
6262
"If this isn't a flush packet, we don't know what's going on"
6363
);
64-
reader.read_line(&mut line)?;
64+
reader.readline_str(&mut line)?;
6565
reader.reset(Protocol::V1);
6666
match reader.peek_data_line() {
6767
Some(Ok(Ok(line))) => String::from_utf8_lossy(line),
@@ -75,7 +75,7 @@ impl Response {
7575
if Response::parse_v1_ack_or_shallow_or_assume_pack(&mut acks, &mut shallows, &peeked_line) {
7676
break 'lines true;
7777
}
78-
assert_ne!(reader.read_line(&mut line)?, 0, "consuming a peeked line works");
78+
assert_ne!(reader.readline_str(&mut line)?, 0, "consuming a peeked line works");
7979
};
8080
Ok(Response {
8181
acks,
@@ -93,7 +93,7 @@ impl Response {
9393
let mut wanted_refs = Vec::<WantedRef>::new();
9494
let has_pack = 'section: loop {
9595
line.clear();
96-
if reader.read_line(&mut line)? == 0 {
96+
if reader.readline_str(&mut line)? == 0 {
9797
return Err(response::Error::Io(io::Error::new(
9898
io::ErrorKind::UnexpectedEof,
9999
"Could not read message headline",

gix-protocol/src/handshake/refs/tests.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,20 @@ impl<'a> gix_transport::client::ReadlineBufRead for Fixture<'a> {
170170
self.0 = lines.as_bytes();
171171
Some(Ok(Ok(gix_packetline::PacketLineRef::Data(res))))
172172
}
173+
174+
fn readline_str(&mut self, line: &mut String) -> std::io::Result<usize> {
175+
use bstr::{BStr, ByteSlice};
176+
let bytes: &BStr = self.0.into();
177+
let mut lines = bytes.lines();
178+
let res = match lines.next() {
179+
None => return Ok(0),
180+
Some(line) => line,
181+
};
182+
self.0 = lines.as_bytes();
183+
let len = res.len();
184+
line.push_str(res.to_str().expect("valid UTF8 in fixture"));
185+
Ok(len)
186+
}
173187
}
174188

175189
#[cfg(feature = "async-client")]
@@ -220,4 +234,17 @@ impl<'a> gix_transport::client::ReadlineBufRead for Fixture<'a> {
220234
self.0 = lines.as_bytes();
221235
Some(Ok(Ok(gix_packetline::PacketLineRef::Data(res))))
222236
}
237+
async fn readline_str(&mut self, line: &mut String) -> std::io::Result<usize> {
238+
use bstr::{BStr, ByteSlice};
239+
let bytes: &BStr = self.0.into();
240+
let mut lines = bytes.lines();
241+
let res = match lines.next() {
242+
None => return Ok(0),
243+
Some(line) => line,
244+
};
245+
self.0 = lines.as_bytes();
246+
let len = res.len();
247+
line.push_str(res.to_str().expect("valid UTF8 in fixture"));
248+
Ok(len)
249+
}
223250
}

gix-protocol/tests/fetch/response.rs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,37 @@ mod v1 {
6969
Ok(())
7070
}
7171

72+
#[maybe_async::test(feature = "blocking-client", async(feature = "async-client", async_std::test))]
73+
async fn unshallow_fetch() -> crate::Result {
74+
let mut provider = mock_reader("v1/fetch-unshallow.response");
75+
let mut reader = provider.as_read_without_sidebands();
76+
let r = fetch::Response::from_line_reader(Protocol::V1, &mut reader).await?;
77+
assert_eq!(
78+
r.acknowledgements(),
79+
&[
80+
Acknowledgement::Common(id("f99771fe6a1b535783af3163eba95a927aae21d5")),
81+
Acknowledgement::Common(id("2d9d136fb0765f2e24c44a0f91984318d580d03b")),
82+
Acknowledgement::Common(id("dfd0954dabef3b64f458321ef15571cc1a46d552")),
83+
]
84+
);
85+
assert_eq!(
86+
r.shallow_updates(),
87+
&[
88+
ShallowUpdate::Unshallow(id("2d9d136fb0765f2e24c44a0f91984318d580d03b")),
89+
ShallowUpdate::Unshallow(id("dfd0954dabef3b64f458321ef15571cc1a46d552"))
90+
]
91+
);
92+
assert!(r.has_pack());
93+
let mut pack = Vec::new();
94+
reader.read_to_end(&mut pack).await?;
95+
assert_eq!(
96+
pack.len(),
97+
2662,
98+
"should be able to read the whole pack (and progress info)"
99+
);
100+
Ok(())
101+
}
102+
72103
#[maybe_async::test(feature = "blocking-client", async(feature = "async-client", async_std::test))]
73104
async fn fetch_acks_without_pack() -> crate::Result {
74105
let mut provider = mock_reader("v1/fetch-no-pack.response");
@@ -159,6 +190,38 @@ mod v2 {
159190
Ok(())
160191
}
161192

193+
#[maybe_async::test(feature = "blocking-client", async(feature = "async-client", async_std::test))]
194+
async fn unshallow_fetch() -> crate::Result {
195+
let mut provider = mock_reader("v2/fetch-unshallow.response");
196+
let mut reader = provider.as_read_without_sidebands();
197+
let r = fetch::Response::from_line_reader(Protocol::V2, &mut reader).await?;
198+
assert_eq!(
199+
r.acknowledgements(),
200+
&[
201+
Acknowledgement::Common(id("f99771fe6a1b535783af3163eba95a927aae21d5")),
202+
Acknowledgement::Common(id("2d9d136fb0765f2e24c44a0f91984318d580d03b")),
203+
Acknowledgement::Common(id("dfd0954dabef3b64f458321ef15571cc1a46d552")),
204+
Acknowledgement::Ready,
205+
]
206+
);
207+
assert_eq!(
208+
r.shallow_updates(),
209+
&[
210+
ShallowUpdate::Unshallow(id("2d9d136fb0765f2e24c44a0f91984318d580d03b")),
211+
ShallowUpdate::Unshallow(id("dfd0954dabef3b64f458321ef15571cc1a46d552"))
212+
]
213+
);
214+
assert!(r.has_pack());
215+
let mut pack = Vec::new();
216+
reader.read_to_end(&mut pack).await?;
217+
assert_eq!(
218+
pack.len(),
219+
2664,
220+
"should be able to read the whole pack (and progress info)"
221+
);
222+
Ok(())
223+
}
224+
162225
#[maybe_async::test(feature = "blocking-client", async(feature = "async-client", async_std::test))]
163226
async fn empty_shallow_clone() -> crate::Result {
164227
let mut provider = mock_reader("v2/clone-deepen-5.response");
@@ -199,7 +262,7 @@ mod v2 {
199262
async fn fetch_acks_without_pack() -> crate::Result {
200263
let mut provider = mock_reader("v2/fetch-no-pack.response");
201264
let r = fetch::Response::from_line_reader(Protocol::V2, &mut provider.as_read_without_sidebands()).await?;
202-
assert_eq!(r.acknowledgements(), &[Acknowledgement::Nak,]);
265+
assert_eq!(r.acknowledgements(), &[Acknowledgement::Nak]);
203266
Ok(())
204267
}
205268

Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)