diff options
Diffstat (limited to 'plumbing/protocol/packp/advrefs_decode.go')
-rw-r--r-- | plumbing/protocol/packp/advrefs_decode.go | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/plumbing/protocol/packp/advrefs_decode.go b/plumbing/protocol/packp/advrefs_decode.go index 5926645..964e3eb 100644 --- a/plumbing/protocol/packp/advrefs_decode.go +++ b/plumbing/protocol/packp/advrefs_decode.go @@ -27,8 +27,13 @@ type advRefsDecoder struct { data *AdvRefs // parsed data is stored here } -// ErrEmptyAdvRefs is returned by Decode when there was no advertised-message at all -var ErrEmptyAdvRefs = errors.New("empty advertised-ref message") +var ( + // ErrEmptyAdvRefs is returned by Decode if it gets an empty advertised + // references message. + ErrEmptyAdvRefs = errors.New("empty advertised-ref message") + // ErrEmptyInput is returned by Decode if the input is empty. + ErrEmptyInput = errors.New("empty input") +) func newAdvRefsDecoder(r io.Reader) *advRefsDecoder { return &advRefsDecoder{ @@ -67,7 +72,7 @@ func (d *advRefsDecoder) nextLine() bool { } if d.nLine == 1 { - d.err = ErrEmptyAdvRefs + d.err = ErrEmptyInput return false } @@ -87,33 +92,31 @@ func decodePrefix(d *advRefsDecoder) decoderStateFn { return nil } - // If the repository is empty, we receive a flush here (SSH). - if isFlush(d.line) { - d.err = ErrEmptyAdvRefs + if !isPrefix(d.line) { + return decodeFirstHash + } + + tmp := make([]byte, len(d.line)) + copy(tmp, d.line) + d.data.Prefix = append(d.data.Prefix, tmp) + if ok := d.nextLine(); !ok { return nil } - if isPrefix(d.line) { - tmp := make([]byte, len(d.line)) - copy(tmp, d.line) - d.data.Prefix = append(d.data.Prefix, tmp) - if ok := d.nextLine(); !ok { - return nil - } + if !isFlush(d.line) { + return decodeFirstHash } - if isFlush(d.line) { - d.data.Prefix = append(d.data.Prefix, pktline.Flush) - if ok := d.nextLine(); !ok { - return nil - } + d.data.Prefix = append(d.data.Prefix, pktline.Flush) + if ok := d.nextLine(); !ok { + return nil } return decodeFirstHash } func isPrefix(payload []byte) bool { - return payload[0] == '#' + return len(payload) > 0 && payload[0] == '#' } func isFlush(payload []byte) bool { |