From df9514a1384336f6a7089063f94dabd3f2379819 Mon Sep 17 00:00:00 2001 From: Taylor Blau Date: Mon, 7 Nov 2016 14:06:44 -0700 Subject: [PATCH] git: return number of bytes accepted, not written --- git/packet_writer.go | 23 +++++++++++------------ git/packet_writer_test.go | 16 ++++++++-------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/git/packet_writer.go b/git/packet_writer.go index 7a8a80ed..3aa4ca6a 100644 --- a/git/packet_writer.go +++ b/git/packet_writer.go @@ -45,9 +45,11 @@ func NewPacketWriter(w io.Writer, c int) *PacketWriter { // the remaining data in the buffer, and write the terminating bytes to the // underlying packet stream. // -// Write returns the number of bytes in "p" actually written to the underlying -// protocol stream, not including the number of bytes written in those packets -// headers. If any error was encountered while either buffering or writing, that +// Write returns the number of bytes in "p" accepted into the writer, which +// _MAY_ be written to the underlying protocol stream, or may be written into +// the internal buffer. +// +// If any error was encountered while either buffering or writing, that // error is returned, along with the number of bytes written to the underlying // protocol stream, as described above. func (w *PacketWriter) Write(p []byte) (int, error) { @@ -58,15 +60,12 @@ func (w *PacketWriter) Write(p []byte) (int, error) { // stored in the buffer, and then write the a packet termination // sequence. - flushed, err := w.flush() - if err != nil { + if _, err := w.flush(); err != nil { return 0, err } - n = n + flushed - - if err = w.proto.writeFlush(); err != nil { - return n, err + if err := w.proto.writeFlush(); err != nil { + return 0, err } } @@ -83,16 +82,16 @@ func (w *PacketWriter) Write(p []byte) (int, error) { // have in the internal buffer. p = p[m:] + n = n + m + if len(w.buf) == MaxPacketLength { // If we were able to grab an entire packet's worth of // data, flush the buffer. - flushed, err := w.flush() - if err != nil { + if _, err := w.flush(); err != nil { return n, err } - n = n + flushed } } diff --git a/git/packet_writer_test.go b/git/packet_writer_test.go index ed1c22ff..10d205af 100644 --- a/git/packet_writer_test.go +++ b/git/packet_writer_test.go @@ -12,8 +12,8 @@ func TestPacketWriterWritesPacketsShorterThanMaxPacketSize(t *testing.T) { var buf bytes.Buffer w := NewPacketWriter(&buf, 0) - assertWriterWrite(t, w, []byte("Hello, world!"), 0) - assertWriterWrite(t, w, nil, len("Hello, world!")) + assertWriterWrite(t, w, []byte("Hello, world!"), 13) + assertWriterWrite(t, w, nil, 0) proto := newProtocolRW(&buf, nil) assertPacketRead(t, proto, []byte("Hello, world!")) @@ -45,9 +45,9 @@ func TestPacketWriterWritesMultiplePacketsLessThanMaxPacketLength(t *testing.T) var buf bytes.Buffer w := NewPacketWriter(&buf, 0) - assertWriterWrite(t, w, []byte("first\n"), 0) - assertWriterWrite(t, w, []byte("second"), 0) - assertWriterWrite(t, w, nil, len("first\nsecond")) + assertWriterWrite(t, w, []byte("first\n"), len("first\n")) + assertWriterWrite(t, w, []byte("second"), len("second")) + assertWriterWrite(t, w, nil, 0) proto := newProtocolRW(&buf, nil) assertPacketRead(t, proto, []byte("first\nsecond")) @@ -72,9 +72,9 @@ func TestPacketWriterWritesMultiplePacketsGreaterThanMaxPacketLength(t *testing. copy(p2, b1) w := NewPacketWriter(&buf, 0) - assertWriterWrite(t, w, p1, 0) - assertWriterWrite(t, w, p2, MaxPacketLength) - assertWriterWrite(t, w, nil, (len(b1)+len(b2))-MaxPacketLength) + assertWriterWrite(t, w, p1, len(p1)) + assertWriterWrite(t, w, p2, len(p2)) + assertWriterWrite(t, w, nil, 0) // offs is how far into b2 we needed to buffer before writing an entire // packet