Merge pull request #797 from jvusich/fix/oversize-pkt-line

plumbing: format: pktline, Accept oversized pkt-lines up to 65524 bytes
diff --git a/plumbing/format/pktline/encoder.go b/plumbing/format/pktline/encoder.go
index eae85cc..6d40979 100644
--- a/plumbing/format/pktline/encoder.go
+++ b/plumbing/format/pktline/encoder.go
@@ -17,6 +17,9 @@
 const (
 	// MaxPayloadSize is the maximum payload size of a pkt-line in bytes.
 	MaxPayloadSize = 65516
+
+	// For compatibility with canonical Git implementation, accept longer pkt-lines
+	OversizePayloadMax = 65520
 )
 
 var (
diff --git a/plumbing/format/pktline/scanner.go b/plumbing/format/pktline/scanner.go
index 4af254f..99aab46 100644
--- a/plumbing/format/pktline/scanner.go
+++ b/plumbing/format/pktline/scanner.go
@@ -97,7 +97,7 @@
 		return 0, nil
 	case n <= lenSize:
 		return 0, ErrInvalidPktLen
-	case n > MaxPayloadSize+lenSize:
+	case n > OversizePayloadMax+lenSize:
 		return 0, ErrInvalidPktLen
 	default:
 		return n - lenSize, nil
diff --git a/plumbing/format/pktline/scanner_test.go b/plumbing/format/pktline/scanner_test.go
index 048ea38..9660c2d 100644
--- a/plumbing/format/pktline/scanner_test.go
+++ b/plumbing/format/pktline/scanner_test.go
@@ -20,7 +20,7 @@
 	for _, test := range [...]string{
 		"0001", "0002", "0003", "0004",
 		"0001asdfsadf", "0004foo",
-		"fff1", "fff2",
+		"fff5", "ffff",
 		"gorka",
 		"0", "003",
 		"   5a", "5   a", "5   \n",
@@ -34,6 +34,20 @@
 	}
 }
 
+func (s *SuiteScanner) TestDecodeOversizePktLines(c *C) {
+	for _, test := range [...]string{
+		"fff1" + strings.Repeat("a", 0xfff1),
+		"fff2" + strings.Repeat("a", 0xfff2),
+		"fff3" + strings.Repeat("a", 0xfff3),
+		"fff4" + strings.Repeat("a", 0xfff4),
+	} {
+		r := strings.NewReader(test)
+		sc := pktline.NewScanner(r)
+		_ = sc.Scan()
+		c.Assert(sc.Err(), IsNil)
+	}
+}
+
 func (s *SuiteScanner) TestEmptyReader(c *C) {
 	r := strings.NewReader("")
 	sc := pktline.NewScanner(r)