Skip to content

Commit 9f18d9b

Browse files
committed
[ref-ls] don't do anything on drop
This is not actually required and may even be a problem as it would trigger even though we are aborting, quitting.
1 parent abb56d8 commit 9f18d9b

File tree

9 files changed

+47
-78
lines changed

9 files changed

+47
-78
lines changed

git-packetline/tests/packet_line/write.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fn empty_writes_fail_with_error() {
4646
}
4747

4848
#[test]
49-
fn nothing_happens_on_drop() {
49+
fn nothing_happens_on_into_read() {
5050
let mut out = Vec::new();
5151
let w = Writer::new(&mut out);
5252
drop(w);

git-protocol/src/fetch/arguments.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,15 @@ impl Arguments {
121121
}
122122
match version {
123123
git_transport::Protocol::V1 => {
124-
let mut on_drop = if add_done_argument {
125-
vec![client::MessageKind::Text(&b"done"[..])]
124+
let on_into_read = if add_done_argument {
125+
client::MessageKind::Text(&b"done"[..])
126126
} else {
127-
vec![client::MessageKind::Flush]
127+
client::MessageKind::Flush
128128
};
129129
let is_stateful = transport.is_stateful();
130130
let retained_state = if is_stateful { None } else { Some(self.args.clone()) };
131-
let mut line_writer = transport.request(client::WriteMode::OneLFTerminatedLinePerWriteCall, on_drop)?;
131+
let mut line_writer =
132+
transport.request(client::WriteMode::OneLFTerminatedLinePerWriteCall, on_into_read)?;
132133

133134
for arg in self.args.drain(..) {
134135
line_writer.write_all(&arg)?;
@@ -140,7 +141,7 @@ impl Arguments {
140141
if let Some(next_args) = retained_state {
141142
self.args = next_args;
142143
}
143-
Ok(line_writer.into_read())
144+
Ok(line_writer.into_read()?)
144145
}
145146
git_transport::Protocol::V2 => {
146147
let mut arguments = std::mem::replace(&mut self.args, self.base_args.clone());

git-transport/src/client/connect.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ mod box_impl {
4545
self.deref_mut().set_identity(identity)
4646
}
4747

48-
fn request(&mut self, write_mode: WriteMode, on_drop: Vec<MessageKind>) -> Result<RequestWriter, Error> {
49-
self.deref_mut().request(write_mode, on_drop)
48+
fn request(&mut self, write_mode: WriteMode, on_into_read: MessageKind) -> Result<RequestWriter, Error> {
49+
self.deref_mut().request(write_mode, on_into_read)
5050
}
5151

5252
fn close(&mut self) -> Result<(), Error> {

git-transport/src/client/file.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ impl client::Transport for SpawnProcessOnDemand {
114114
c.handshake(service)
115115
}
116116

117-
fn request(&mut self, write_mode: WriteMode, on_drop: Vec<MessageKind>) -> Result<RequestWriter, client::Error> {
117+
fn request(&mut self, write_mode: WriteMode, on_into_read: MessageKind) -> Result<RequestWriter, client::Error> {
118118
self.connection
119119
.as_mut()
120120
.expect("handshake() to have been called first")
121-
.request(write_mode, on_drop)
121+
.request(write_mode, on_into_read)
122122
}
123123

124124
fn close(&mut self) -> Result<(), client::Error> {

git-transport/src/client/git.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,13 @@ where
9393
fn request(
9494
&mut self,
9595
write_mode: client::WriteMode,
96-
on_drop: Vec<client::MessageKind>,
96+
on_into_read: client::MessageKind,
9797
) -> Result<client::RequestWriter, client::Error> {
9898
Ok(client::RequestWriter::new_from_bufread(
9999
&mut self.writer,
100100
Box::new(self.line_provider.as_read_without_sidebands()),
101101
write_mode,
102-
on_drop,
102+
on_into_read,
103103
))
104104
}
105105

git-transport/src/client/http/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ impl<H: Http> client::Transport for Transport<H> {
142142
fn request(
143143
&mut self,
144144
write_mode: client::WriteMode,
145-
on_drop: Vec<client::MessageKind>,
145+
on_into_read: client::MessageKind,
146146
) -> Result<client::RequestWriter, client::Error> {
147147
let service = self.service.expect("handshake() must have been called first");
148148
let url = append_url(&self.url, service.as_str());
@@ -179,7 +179,7 @@ impl<H: Http> client::Transport for Transport<H> {
179179
body: line_provider.as_read_without_sidebands(),
180180
}),
181181
write_mode,
182-
on_drop,
182+
on_into_read,
183183
))
184184
}
185185

git-transport/src/client/mod.rs

Lines changed: 21 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ pub enum Identity {
9191

9292
/// A type implementing `Write`, which when done can be transformed into a `Read` for obtaining the response.
9393
pub struct RequestWriter<'a> {
94-
pub(crate) writer: WritePacketOnDrop<Box<dyn io::Write + 'a>>,
94+
on_into_read: MessageKind,
95+
pub(crate) writer: git_packetline::Writer<Box<dyn io::Write + 'a>>,
9596
pub(crate) reader: Box<dyn ExtendedBufRead + 'a>,
9697
}
9798

@@ -110,24 +111,32 @@ impl<'a> RequestWriter<'a> {
110111
writer: W,
111112
reader: Box<dyn ExtendedBufRead + 'a>,
112113
write_mode: WriteMode,
113-
on_drop: Vec<MessageKind>,
114+
on_into_read: MessageKind,
114115
) -> Self {
115116
let mut writer = git_packetline::Writer::new(Box::new(writer) as Box<dyn io::Write>);
116117
match write_mode {
117118
WriteMode::Binary => writer.enable_binary_mode(),
118119
WriteMode::OneLFTerminatedLinePerWriteCall => writer.enable_text_mode(),
119120
}
120121
RequestWriter {
121-
writer: WritePacketOnDrop::new(writer, on_drop),
122+
on_into_read,
123+
writer,
122124
reader,
123125
}
124126
}
125-
pub fn into_read(self) -> Box<dyn ExtendedBufRead + 'a> {
126-
self.reader
127+
pub fn into_read(mut self) -> io::Result<Box<dyn ExtendedBufRead + 'a>> {
128+
self.write_message(self.on_into_read)?;
129+
Ok(self.reader)
127130
}
128131

129-
pub fn write_message(&mut self, kind: MessageKind) -> io::Result<()> {
130-
self.writer.write_message(kind)
132+
pub fn write_message(&mut self, message: MessageKind) -> io::Result<()> {
133+
match message {
134+
MessageKind::Flush => git_packetline::PacketLine::Flush.to_write(&mut self.writer.inner),
135+
MessageKind::Delimiter => git_packetline::PacketLine::Delimiter.to_write(&mut self.writer.inner),
136+
MessageKind::Text(t) => git_packetline::borrowed::Text::from(t).to_write(&mut self.writer.inner),
137+
}
138+
.map(|_| ())
139+
.map_err(|err| io::Error::new(io::ErrorKind::Other, err))
131140
}
132141
}
133142

@@ -143,47 +152,6 @@ impl<'a, T: io::Read> ExtendedBufRead for git_packetline::provider::ReadWithSide
143152

144153
pub type HandleProgress = Box<dyn FnMut(bool, &[u8])>;
145154

146-
pub(crate) struct WritePacketOnDrop<W: io::Write> {
147-
inner: git_packetline::Writer<W>,
148-
on_drop: Vec<MessageKind>,
149-
}
150-
151-
impl<W: io::Write> WritePacketOnDrop<W> {
152-
pub fn new(inner: git_packetline::Writer<W>, on_drop: Vec<MessageKind>) -> Self {
153-
WritePacketOnDrop { inner, on_drop }
154-
}
155-
156-
pub fn write_message(&mut self, message: MessageKind) -> io::Result<()> {
157-
match message {
158-
MessageKind::Flush => git_packetline::PacketLine::Flush.to_write(&mut self.inner.inner),
159-
MessageKind::Delimiter => git_packetline::PacketLine::Delimiter.to_write(&mut self.inner.inner),
160-
MessageKind::Text(t) => git_packetline::borrowed::Text::from(t).to_write(&mut self.inner.inner),
161-
}
162-
.map(|_| ())
163-
.map_err(|err| io::Error::new(io::ErrorKind::Other, err))
164-
}
165-
}
166-
167-
impl<W: io::Write> io::Write for WritePacketOnDrop<W> {
168-
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
169-
self.inner.write(buf)
170-
}
171-
172-
fn flush(&mut self) -> io::Result<()> {
173-
self.inner.flush()
174-
}
175-
}
176-
177-
impl<W: io::Write> Drop for WritePacketOnDrop<W> {
178-
fn drop(&mut self) {
179-
let mut on_drop = std::mem::take(&mut self.on_drop);
180-
for msg in on_drop.drain(..) {
181-
self.write_message(msg)
182-
.expect("packet line write on drop must work or we may as well panic to prevent weird surprises");
183-
}
184-
}
185-
}
186-
187155
/// All methods provided here must be called in the correct order according to the communication protocol used to connect to them.
188156
/// It does, however, know just enough to be able to provide a higher-level interface than would otherwise be possible.
189157
/// Thus the consumer of this trait will not have to deal with packet lines at all.
@@ -208,10 +176,10 @@ pub trait Transport {
208176
}
209177
/// Obtain a writer for sending data and obtaining the response. It can be configured in various ways,
210178
/// and should to support with the task at hand.
211-
/// `send_mode` determines how calls to the `write(…)` method are interpreted, and `on_drop` determines
212-
/// which messages to write when the writer is dropped. This happens naturally when switching to reading the response with `into_read()`.
179+
/// `send_mode` determines how calls to the `write(…)` method are interpreted, and `on_into_read` determines
180+
/// which message to write when the writer is turned into the response reader using `into_read()`.
213181
/// If `handle_progress` is not None, it's function passed a text line without trailing LF from which progress information can be parsed.
214-
fn request(&mut self, write_mode: WriteMode, on_drop: Vec<MessageKind>) -> Result<RequestWriter, Error>;
182+
fn request(&mut self, write_mode: WriteMode, on_into_read: MessageKind) -> Result<RequestWriter, Error>;
215183

216184
/// Closes the connection to indicate no further requests will be made.
217185
fn close(&mut self) -> Result<(), Error>;
@@ -253,7 +221,7 @@ impl<T: Transport> TransportV2Ext for T {
253221
capabilities: impl IntoIterator<Item = (&'a str, Option<&'a str>)>,
254222
arguments: Option<impl IntoIterator<Item = BString>>,
255223
) -> Result<Box<dyn ExtendedBufRead + '_>, Error> {
256-
let mut writer = self.request(WriteMode::OneLFTerminatedLinePerWriteCall, vec![MessageKind::Flush])?;
224+
let mut writer = self.request(WriteMode::OneLFTerminatedLinePerWriteCall, MessageKind::Flush)?;
257225
writer.write_all(format!("command={}", command).as_bytes())?;
258226
for (name, value) in capabilities {
259227
match value {
@@ -267,6 +235,6 @@ impl<T: Transport> TransportV2Ext for T {
267235
writer.write_all(argument.as_ref())?;
268236
}
269237
}
270-
Ok(writer.into_read())
238+
Ok(writer.into_read()?)
271239
}
272240
}

git-transport/tests/client/git.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,18 @@ fn handshake_v1_and_request() -> crate::Result {
7272
);
7373
drop(res);
7474

75-
let writer = c.request(client::WriteMode::Binary, Vec::new())?;
76-
assert_eq!(writer.into_read().lines().next().expect("exactly one line")?, "NAK");
75+
let writer = c.request(client::WriteMode::Binary, client::MessageKind::Flush)?;
76+
assert_eq!(writer.into_read()?.lines().next().expect("exactly one line")?, "NAK");
7777

7878
let mut writer = c.request(
7979
client::WriteMode::OneLFTerminatedLinePerWriteCall,
80-
vec![client::MessageKind::Flush, client::MessageKind::Text(b"done")],
80+
client::MessageKind::Text(b"done"),
8181
)?;
8282

8383
writer.write_all(b"hello")?;
8484
writer.write_all(b"world")?;
8585

86-
let mut reader = writer.into_read();
86+
let mut reader = writer.into_read()?;
8787
let messages = Rc::new(RefCell::new(Vec::<String>::new()));
8888
reader.set_progress_handler(Some(Box::new({
8989
let sb = messages.clone();
@@ -105,9 +105,9 @@ fn handshake_v1_and_request() -> crate::Result {
105105

106106
assert_eq!(
107107
out.as_slice().as_bstr(),
108-
b"002egit-upload-pack /foo.git\0host=example.org\0000ahello\n\
108+
b"002egit-upload-pack /foo.git\0host=example.org\00000000ahello\n\
109109
000aworld\n\
110-
00000009done\n0000"
110+
0009done\n0000"
111111
.as_bstr(),
112112
"it sends the correct request"
113113
);

git-transport/tests/client/http/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Authorization: Basic dXNlcjpwYXNzd29yZA==
6464
);
6565

6666
server.next_read_and_respond_with(fixture_bytes("v1/http-handshake.response"));
67-
client.request(client::WriteMode::Binary, Vec::new())?;
67+
client.request(client::WriteMode::Binary, client::MessageKind::Flush)?;
6868

6969
assert_eq!(
7070
server.received_as_string().lines().collect::<Vec<_>>(),
@@ -238,12 +238,12 @@ fn clone_v1() -> crate::Result {
238238
server.next_read_and_respond_with(fixture_bytes("v1/http-clone.response"));
239239
let mut writer = c.request(
240240
client::WriteMode::OneLFTerminatedLinePerWriteCall,
241-
vec![client::MessageKind::Flush, client::MessageKind::Text(b"done")],
241+
client::MessageKind::Text(b"done"),
242242
)?;
243243
writer.write_all(b"hello")?;
244244
writer.write_all(b"world")?;
245245

246-
let mut reader = writer.into_read();
246+
let mut reader = writer.into_read()?;
247247
let mut line = String::new();
248248
reader.read_line(&mut line)?;
249249
assert_eq!(line, "NAK\n", "we receive a NAK in text mode before the PACK is sent");
@@ -275,10 +275,10 @@ User-Agent: git/oxide-{}
275275
Content-Type: application/x-git-upload-pack-request
276276
Accept: application/x-git-upload-pack-result
277277
278-
21
278+
1d
279279
000ahello
280280
000aworld
281-
00000009done
281+
0009done
282282
283283
0
284284

0 commit comments

Comments
 (0)