Merge pull request #1658 from git-lfs/less-flushing
filter-process: less flushing
This commit is contained in:
commit
1e4febec34
@ -35,6 +35,7 @@ func TestFilterProcessScannerRejectsUnrecognizedInitializationMessages(t *testin
|
|||||||
|
|
||||||
pl := newPktline(nil, &from)
|
pl := newPktline(nil, &from)
|
||||||
require.Nil(t, pl.writePacketText("git-filter-client-unknown"))
|
require.Nil(t, pl.writePacketText("git-filter-client-unknown"))
|
||||||
|
require.Nil(t, pl.writeFlush())
|
||||||
|
|
||||||
fps := NewFilterProcessScanner(&from, &to)
|
fps := NewFilterProcessScanner(&from, &to)
|
||||||
err := fps.Init()
|
err := fps.Init()
|
||||||
@ -106,8 +107,7 @@ func TestFilterProcessScannerReadsRequestHeadersAndPayload(t *testing.T) {
|
|||||||
// Multi-line packet
|
// Multi-line packet
|
||||||
require.Nil(t, pl.writePacketText("first"))
|
require.Nil(t, pl.writePacketText("first"))
|
||||||
require.Nil(t, pl.writePacketText("second"))
|
require.Nil(t, pl.writePacketText("second"))
|
||||||
_, err := from.Write([]byte{0x30, 0x30, 0x30, 0x30}) // flush packet
|
require.Nil(t, pl.writeFlush())
|
||||||
assert.Nil(t, err)
|
|
||||||
|
|
||||||
req, err := readRequest(NewFilterProcessScanner(&from, &to))
|
req, err := readRequest(NewFilterProcessScanner(&from, &to))
|
||||||
|
|
||||||
@ -121,13 +121,11 @@ func TestFilterProcessScannerReadsRequestHeadersAndPayload(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFilterProcessScannerRejectsInvalidHeaderPackets(t *testing.T) {
|
func TestFilterProcessScannerRejectsInvalidHeaderPackets(t *testing.T) {
|
||||||
var from bytes.Buffer
|
from := bytes.NewBuffer([]byte{
|
||||||
|
0x30, 0x30, 0x30, 0x34, // 0004 (invalid packet length)
|
||||||
|
})
|
||||||
|
|
||||||
pl := newPktline(nil, &from)
|
req, err := readRequest(NewFilterProcessScanner(from, nil))
|
||||||
// (Invalid) headers
|
|
||||||
require.Nil(t, pl.writePacket([]byte{}))
|
|
||||||
|
|
||||||
req, err := readRequest(NewFilterProcessScanner(&from, nil))
|
|
||||||
|
|
||||||
require.NotNil(t, err)
|
require.NotNil(t, err)
|
||||||
assert.Equal(t, "Invalid packet length.", err.Error())
|
assert.Equal(t, "Invalid packet length.", err.Error())
|
||||||
|
@ -68,11 +68,17 @@ func (p *pktline) readPacket() ([]byte, error) {
|
|||||||
return payload, err
|
return payload, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// readPacketText follows identical semantics to the `readPacket()` function,
|
||||||
|
// but additionally removes the trailing `\n` LF from the end of the packet, if
|
||||||
|
// present.
|
||||||
func (p *pktline) readPacketText() (string, error) {
|
func (p *pktline) readPacketText() (string, error) {
|
||||||
data, err := p.readPacket()
|
data, err := p.readPacket()
|
||||||
return strings.TrimSuffix(string(data), "\n"), err
|
return strings.TrimSuffix(string(data), "\n"), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// readPacketList reads as many packets as possible using the `readPacketText`
|
||||||
|
// function before encountering a flush packet. It returns a slice of all the
|
||||||
|
// packets it read, or an error if one was encountered.
|
||||||
func (p *pktline) readPacketList() ([]string, error) {
|
func (p *pktline) readPacketList() ([]string, error) {
|
||||||
var list []string
|
var list []string
|
||||||
for {
|
for {
|
||||||
@ -91,6 +97,15 @@ func (p *pktline) readPacketList() ([]string, error) {
|
|||||||
return list, nil
|
return list, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writePacket writes the given data in "data" to the underlying data stream
|
||||||
|
// using Git's `pkt-line` format.
|
||||||
|
//
|
||||||
|
// If the data was longer than MaxPacketLength, an error will be returned. If
|
||||||
|
// there was any error encountered while writing any component of the packet
|
||||||
|
// (hdr, payload), it will be returned.
|
||||||
|
//
|
||||||
|
// NB: writePacket does _not_ flush the underlying buffered writer. See instead:
|
||||||
|
// `writeFlush()`.
|
||||||
func (p *pktline) writePacket(data []byte) error {
|
func (p *pktline) writePacket(data []byte) error {
|
||||||
if len(data) > MaxPacketLength {
|
if len(data) > MaxPacketLength {
|
||||||
return errors.New("Packet length exceeds maximal length")
|
return errors.New("Packet length exceeds maximal length")
|
||||||
@ -104,13 +119,13 @@ func (p *pktline) writePacket(data []byte) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := p.w.Flush(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writeFlush writes the terminating "flush" packet and then flushes the
|
||||||
|
// underlying buffered writer.
|
||||||
|
//
|
||||||
|
// If any error was encountered along the way, it will be returned immediately
|
||||||
func (p *pktline) writeFlush() error {
|
func (p *pktline) writeFlush() error {
|
||||||
if _, err := p.w.WriteString(fmt.Sprintf("%04x", 0)); err != nil {
|
if _, err := p.w.WriteString(fmt.Sprintf("%04x", 0)); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -123,10 +138,16 @@ func (p *pktline) writeFlush() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writePacketText follows the same semantics as `writePacket`, but appends a
|
||||||
|
// trailing "\n" LF character to the end of the data.
|
||||||
func (p *pktline) writePacketText(data string) error {
|
func (p *pktline) writePacketText(data string) error {
|
||||||
return p.writePacket([]byte(data + "\n"))
|
return p.writePacket([]byte(data + "\n"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writePacketList writes a slice of strings using the semantics of
|
||||||
|
// and then writes a terminating flush sequence afterwords.
|
||||||
|
//
|
||||||
|
// If any error was encountered, it will be returned immediately.
|
||||||
func (p *pktline) writePacketList(list []string) error {
|
func (p *pktline) writePacketList(list []string) error {
|
||||||
for _, i := range list {
|
for _, i := range list {
|
||||||
if err := p.writePacketText(i); err != nil {
|
if err := p.writePacketText(i); err != nil {
|
||||||
|
@ -2,28 +2,29 @@ package git
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
// writePackets
|
// writePackets
|
||||||
func writePacket(w io.Writer, datas ...[]byte) {
|
func writePacket(t *testing.T, w io.Writer, datas ...[]byte) {
|
||||||
for _, data := range datas {
|
pl := newPktline(nil, w)
|
||||||
io.WriteString(w, fmt.Sprintf("%04x", len(data)+4))
|
|
||||||
w.Write(data)
|
|
||||||
|
|
||||||
|
for _, data := range datas {
|
||||||
|
require.Nil(t, pl.writePacket(data))
|
||||||
}
|
}
|
||||||
io.WriteString(w, fmt.Sprintf("%04x", 0))
|
|
||||||
|
require.Nil(t, pl.writeFlush())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPktlineReaderReadsSinglePacketsInOneCall(t *testing.T) {
|
func TestPktlineReaderReadsSinglePacketsInOneCall(t *testing.T) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
writePacket(&buf, []byte("asdf"))
|
writePacket(t, &buf, []byte("asdf"))
|
||||||
|
|
||||||
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
||||||
|
|
||||||
@ -36,7 +37,7 @@ func TestPktlineReaderReadsSinglePacketsInOneCall(t *testing.T) {
|
|||||||
func TestPktlineReaderReadsManyPacketsInOneCall(t *testing.T) {
|
func TestPktlineReaderReadsManyPacketsInOneCall(t *testing.T) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
writePacket(&buf, []byte("first\n"), []byte("second"))
|
writePacket(t, &buf, []byte("first\n"), []byte("second"))
|
||||||
|
|
||||||
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
||||||
|
|
||||||
@ -49,7 +50,7 @@ func TestPktlineReaderReadsManyPacketsInOneCall(t *testing.T) {
|
|||||||
func TestPktlineReaderReadsSinglePacketsInMultipleCallsWithUnevenBuffering(t *testing.T) {
|
func TestPktlineReaderReadsSinglePacketsInMultipleCallsWithUnevenBuffering(t *testing.T) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
writePacket(&buf, []byte("asdf"))
|
writePacket(t, &buf, []byte("asdf"))
|
||||||
|
|
||||||
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
||||||
|
|
||||||
@ -70,7 +71,7 @@ func TestPktlineReaderReadsSinglePacketsInMultipleCallsWithUnevenBuffering(t *te
|
|||||||
func TestPktlineReaderReadsManyPacketsInMultipleCallsWithUnevenBuffering(t *testing.T) {
|
func TestPktlineReaderReadsManyPacketsInMultipleCallsWithUnevenBuffering(t *testing.T) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
writePacket(&buf, []byte("first"), []byte("second"))
|
writePacket(t, &buf, []byte("first"), []byte("second"))
|
||||||
|
|
||||||
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
||||||
|
|
||||||
@ -97,7 +98,7 @@ func TestPktlineReaderReadsManyPacketsInMultipleCallsWithUnevenBuffering(t *test
|
|||||||
func TestPktlineReaderReadsSinglePacketsInMultipleCallsWithEvenBuffering(t *testing.T) {
|
func TestPktlineReaderReadsSinglePacketsInMultipleCallsWithEvenBuffering(t *testing.T) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
writePacket(&buf, []byte("firstother"))
|
writePacket(t, &buf, []byte("firstother"))
|
||||||
|
|
||||||
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
||||||
|
|
||||||
@ -118,7 +119,7 @@ func TestPktlineReaderReadsSinglePacketsInMultipleCallsWithEvenBuffering(t *test
|
|||||||
func TestPktlineReaderReadsManyPacketsInMultipleCallsWithEvenBuffering(t *testing.T) {
|
func TestPktlineReaderReadsManyPacketsInMultipleCallsWithEvenBuffering(t *testing.T) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
writePacket(&buf, []byte("first"), []byte("other"))
|
writePacket(t, &buf, []byte("first"), []byte("other"))
|
||||||
|
|
||||||
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
pr := &pktlineReader{pl: newPktline(&buf, nil)}
|
||||||
|
|
||||||
|
@ -169,14 +169,15 @@ func TestPktLineWritesPackets(t *testing.T) {
|
|||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
rw := newPktline(nil, &buf)
|
rw := newPktline(nil, &buf)
|
||||||
err := rw.writePacket([]byte{
|
require.Nil(t, rw.writePacket([]byte{
|
||||||
0x1, 0x2, 0x3, 0x4,
|
0x1, 0x2, 0x3, 0x4,
|
||||||
})
|
}))
|
||||||
|
require.Nil(t, rw.writeFlush())
|
||||||
|
|
||||||
assert.Nil(t, err)
|
|
||||||
assert.Equal(t, []byte{
|
assert.Equal(t, []byte{
|
||||||
0x30, 0x30, 0x30, 0x38, // 0008 (hex. length)
|
0x30, 0x30, 0x30, 0x38, // 0008 (hex. length)
|
||||||
0x1, 0x2, 0x3, 0x4, // payload
|
0x1, 0x2, 0x3, 0x4, // payload
|
||||||
|
0x30, 0x30, 0x30, 0x30, // 0000 (flush packet)
|
||||||
}, buf.Bytes())
|
}, buf.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,12 +206,14 @@ func TestPktLineWritesPacketText(t *testing.T) {
|
|||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
rw := newPktline(nil, &buf)
|
rw := newPktline(nil, &buf)
|
||||||
err := rw.writePacketText("abcd")
|
|
||||||
|
|
||||||
assert.Nil(t, err)
|
require.Nil(t, rw.writePacketText("abcd"))
|
||||||
|
require.Nil(t, rw.writeFlush())
|
||||||
|
|
||||||
assert.Equal(t, []byte{
|
assert.Equal(t, []byte{
|
||||||
0x30, 0x30, 0x30, 0x39, // 0009 (hex. length)
|
0x30, 0x30, 0x30, 0x39, // 0009 (hex. length)
|
||||||
0x61, 0x62, 0x63, 0x64, 0xa, // "abcd\n" (payload)
|
0x61, 0x62, 0x63, 0x64, 0xa, // "abcd\n" (payload)
|
||||||
|
0x30, 0x30, 0x30, 0x30, // 0000 (flush packet)
|
||||||
}, buf.Bytes())
|
}, buf.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user